Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 使用多变量条件比较数据帧_Pandas_Merge - Fatal编程技术网

Pandas 使用多变量条件比较数据帧

Pandas 使用多变量条件比较数据帧,pandas,merge,Pandas,Merge,我在使用merge查找列的值时遇到问题。我有两个数据帧: 测向条件 A | B | C | D | E | F | A1 | B1 | | | | F1| A2 | B2 | | | | F2| A3 | B3 | | D3 | | F3| A4 | B4 | | D4 | E4 | F4| 测向结果 A | B | C | D | E | G | H | A1 |

我在使用merge查找列的值时遇到问题。我有两个数据帧:

测向条件

A  |  B  |  C  |  D  |  E  | F |
A1 | B1  |     |     |     | F1|
A2 | B2  |     |     |     | F2|
A3 | B3  |     |  D3 |     | F3|
A4 | B4  |     |  D4 |  E4 | F4|
测向结果

A  |  B  |  C  |  D  |  E  | G  | H  | 
A1 | B1  |  C1 |  D1 |  E1 | G1 | H1 |
A2 | B2  |  C2 |  D2 |  E2 | G2 | H2 |
A3 | B3  |  C3 |  D3 |  E3 | G3 | H3 |
A4 | B4  |  C4 |  D4 |  E4 | G4 | H4 |
列F的参数值要包含在merge()中,因此我需要df结果

我正在使用代码:

df Result = pd.merge(df Result, df Conditions[[A,B,C,D,E,F]], on = [A,B,C,D,E], how = 'left')
目前,结果是只得到条件数量最多的F列,但不会计算每个条件

A  |  B  |  C  |  D  |  E  | G  | H  | F |
A1 | B1  |  C1 |  D1 |  E1 | G1 | H1 |   |
A2 | B2  |  C2 |  D2 |  E2 | G2 | H2 |   |
A3 | B3  |  C3 |  D3 |  E3 | G3 | H3 |   |
A4 | B4  |  C4 |  D4 |  E4 | G4 | H4 | F4|

我怎样才能做到这一点呢?

我想到了一种利用多重合并的方法。基本思想是为不同列上的
None
值创建多个
通配符
数据帧

df_Conditions=pd.DataFrame(列=['A','B','C','D','E','F'],
数据=[[A1',B1',无,无,无,'F1'],
['A2','B2',无,无,无,'F2'],
[A3',B3',无,'D3',无,'F3'],
['A4','B4',无,'D4','E4','F4'],
])
df_Result=pd.DataFrame(列=['A','B','C','D','E','G','H'],
数据=['A1',B1',C1',D1',E1',G1',H1'],
[A2',B2',C2',D2',E2',G2',H2'],
[A3',B3',C3',D3',E3',G3',H3'],
[A4',B4',C4',D4',E4',G4',H4'],
])
首先,正如您所做的那样,它应该为您提供一个额外的空
列F

res = pd.merge(df_Result, df_Conditions, on=['A', 'B', 'C', 'D', 'E'], how='left')
res
Out[8]: 
    A   B   C   D   E   G   H    F
0  A1  B1  C1  D1  E1  G1  H1  NaN
1  A2  B2  C2  D2  E2  G2  H2  NaN
2  A3  B3  C3  D3  E3  G3  H3  NaN
3  A4  B4  C4  D4  E4  G4  H4  NaN
创建一个通配符数据框作为
df_条件的子数据框

wildcards_C=df_条件[df_条件['C'].isnull()].dropna(axis=1,how='all')
通配符
出[10]:
A B D E F
0 A1 B1无F1
1 A2 B2无无F2
2 A3 B3 D3无F3
3 A4 B4 D4 E4 F4
将其与
df_结果
合并,并更新res上的值

res.update(df_Result.merge(通配符,how='left'),overwrite=False)
物件
出[12]:
A B C D E G H F
0 A1 B1 C1 D1 E1 G1 H1 NaN
1 A2 B2 C2 D2 E2 G2 H2 NaN
2 A3 B3 C3 D3 E3 G3 H3 NaN
3 A4 B4 C4 D4 E4 G4 H4 F4
当A、B、D、E列上的值匹配时,它将更新
res
dataframe上的F列。对E列重复相同的条件

wildcards_E=df_条件[df_条件['E'].isnull()].dropna(axis=1,how='all')
res.update(df_Result.merge(通配符,how='left'),overwrite=False)
物件
出[6]:
A B C D E G H F
0 A1 B1 C1 D1 E1 G1 H1 NaN
1 A2 B2 C2 D2 E2 G2 H2 NaN
2 A3 B3 C3 D3 E3 G3 H3 F3
3 A4 B4 C4 D4 E4 G4 H4 F4
最后对D列重复相同的条件

wildcards\u D=df\u条件[df\u条件['D'].isnull()].dropna(axis=1,how='all')
res.update(df_Result.merge(通配符,how='left'),overwrite=False)
物件
出[6]:
A B C D E G H F
0 A1 B1 C1 D1 E1 G1 H1 F1
1 A2 B2 C2 D2 E2 G2 H2 F2
2 A3 B3 C3 D3 E3 G3 H3 F3
3 A4 B4 C4 D4 E4 G4 H4 F4
出于演示目的,我没有将重复分组成循环


这里的一个缺点是您必须自己分析“通配符”的顺序,当前的策略是:尽可能长地保留通配符最少的列(即D列)。

是否要将F列合并到df_结果?是的,最初我在df_结果中没有F列,但我将F列附加到df条件。我认为这就像excel中的Vlookup一样,但有更多的条件不一定会同时出现df_conditions=pd。merge(df_Result,df_conditions,on='a',allow_exact_matches=True)是否还有其他解决方案,真正的df_结果有更多的列,我无法合并所有的dfSorry,我检查了我的问题,我注意到我写错了我想要作为结果修改的df:df result=pd.merge(df result,df Conditions[[A,B,C,D,E,F]],on=[A,B,C,D,E],how='left')我尝试了你的代码,但没有工作。merge()只是在运行df结果(第F列)后,找不到所有条件和NaN。如果你能帮助我,我真的很感激。修改了我的答案,请看看它是否看起来更好谢谢你的帮助,我尝试了以下代码,但是:当我这样做时:df_Result=pd.merge(df_Result,df_条件['A','B','C','D','E','F','F',on='A','B','C','D','E',how='left')。F列已经有了“F4”,应用接下来的步骤不会发生任何变化。不知道为什么会这样。通配符创建得很好。我还尝试了:df_Result['F']=df_Result['F'].replace(np.nan,,,regex=True),但仍然只显示'F4',很可能您运行的代码与我的代码不同。当我们不同步时,它增加了复杂性。例如,我看不到
df_条件
df_条件[[A','B','C','D','E','F']
之间的区别,因为
df_条件
只包含列
['A','B','C','D','E','F']
。另外,我正在使用另一个数据帧
res
来存储合并结果,而不是覆盖
df_result
。我对第一步调查的建议是,您尝试复制我上面的内容(包括dataframes创建部分),执行代码,看看是否有相同的结果。