将两个数据框与df的两个列值与另一个数据框的单个列值连接在一起。根据某些条件?

时间:2019-02-20 06:08:12

标签: python pandas dataframe

我有一个这样的数据框:

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以最有效的方式做到这一点?

1 个答案:

答案 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