使用多变量条件比较数据框

时间:2019-09-18 21:47:48

标签: pandas merge

使用合并查找列的值时遇到麻烦。我有两个数据框:

df条件

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

df结果

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|

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我想到了一种通过合并使用多个df.update()的方法。基本思想是为不同列上的wildcards值创建多个None数据框

df_Conditions = pd.DataFrame(columns=['A', 'B', 'C', 'D', 'E', 'F'],
                             data=[['A1', 'B1', None, None, None, 'F1'],
                                   ['A2', 'B2', None, None, None, 'F2'],
                                   ['A3', 'B3', None, 'D3', None, 'F3'],
                                   ['A4', 'B4', None, 'D4', 'E4', 'F4'],
                                   ])

df_Result = pd.DataFrame(columns=['A', 'B', 'C', 'D', 'E', 'G', 'H'],
                         data=[['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'],
                               ])

按照您的方式进行第一次合并,它应该会给您额外的空column 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_Conditions的子数据框

wildcards_C = df_Conditions[df_Conditions['C'].isnull()].dropna(axis=1, how='all')
wildcards_C
Out[10]: 
    A   B     D     E   F
0  A1  B1  None  None  F1
1  A2  B2  None  None  F2
2  A3  B3    D3  None  F3
3  A4  B4    D4    E4  F4

df_Result合并,并更新res上的值

res.update(df_Result.merge(wildcards_C, how='left'), overwrite=False)
res
Out[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数据帧上的F列。对条件列E重复相同的操作

wildcards_E = df_Conditions[df_Conditions['E'].isnull()].dropna(axis=1, how='all')
res.update(df_Result.merge(wildcards_E, how='left'), overwrite=False)
res
Out[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_D = df_Conditions[df_Conditions['D'].isnull()].dropna(axis=1, how='all')
res.update(df_Result.merge(wildcards_D, how='left'), overwrite=False)
res
Out[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列)尽可能长。