使用合并查找列的值时遇到麻烦。我有两个数据框:
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|
我该怎么做?
答案 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列)尽可能长。