我有一个这样的数据框:
df1
col1 col2 col3 col4
1 2 A S
3 4 A P
5 6 B R
7 8 B B
我还有另一个数据框:
df2
col5 col6 col3
9 10 A
11 12 R
如果df1的col3和col4的任何值与df2的col3值匹配,我想加入这两个数据帧。
最终数据帧如下所示:
df3
col1 col2 col3 col5 col6
1 2 A 9 10
3 4 A 9 10
5 6 R 11 12
如果col3值出现在df2中,那么它将通过col3值联接,否则,如果它出现在df2的col3值中,它将通过col4值联接
如何使用pandas / python以最有效的方式做到这一点?
答案 0 :(得分:1)
使用带有默认内部联接的双merge
,用于第二次过滤出df3
中匹配的行,最后concat
在一起:
df3 = df1.drop('col4', axis=1).merge(df2, on='col3')
df4 = (df1.drop('col3', axis=1).rename(columns={'col4':'col3'})
.merge(df2[~df2['col3'].isin(df1['col3'])], on='col3'))
df = pd.concat([df3, df4],ignore_index=True)
print (df)
col1 col2 col3 col5 col6
0 1 2 A 9 10
1 3 4 A 9 10
2 5 6 R 11 12
编辑:使用左联接,最后使用combine_first
:
df3 = df1.drop('col4', axis=1).merge(df2, on='col3', how='left')
df4 = (df1.drop('col3', axis=1).rename(columns={'col4':'col3'})
.merge(df2, on='col3', how='left'))
df = df3.combine_first(df4)
print (df)
col1 col2 col3 col5 col6
0 1 2 A 9.0 10.0
1 3 4 A 9.0 10.0
2 5 6 B 11.0 12.0
3 7 8 B NaN NaN