Concat数据帧使用第二个数据帧中的行,这些行不存在于基于列子集的第一个数据帧中

Concat dataframes using rows from second dataframe which don't exist in first dataframe based on subset of columns

我有 2 个大数据框如下:

df1

C1  C2  C3  V1
a   e   k   1
b   f   j   2
d   g   h   3    

df2

C1  C2  C3  V1
a   e   m   21
d   g   p   1
e   f   q   2
f   g   r   3

我想获得以下信息:

C1  C2  C3  V1
a   e   k   1
b   f   j   2
d   g   h   3
e   f   q   2
f   g   r   3

我只包含了 df2 中的行,其中 C1 和 C2 不存在于 df1 中。即我删除了 df2 的第一行,因为 a, e 已经存在于 df1.

我正在尝试:

df1['id'] = df1[['C1', 'C2']].astype(str).apply('_'.join, axis=1)
df2['id'] = df2[['C1', 'C2']].astype(str).apply('_'.join, axis=1)
df3 = df2[~df2['id'].isin(df1['id'])]
pd.concat([df1, df3])

有没有更好的方法使用一些内置函数来做到这一点,因为我 运行 经常遇到这种情况,列数不同。

您可以使用 combine_first:

(df1
 .set_index(['C1', 'C2'])
 .combine_first(df2.set_index(['C1', 'C2']))
 .reset_index()
)

输出:

  C1 C2 C3  V1
0  a  e  k   1
1  b  f  j   2
2  d  g  h   3
3  e  f  q   2
4  f  g  r   3
使用合并

这有点复杂,您需要在 indicator=True 的帮助下执行负合并:

cols = ['C1', 'C2']
df2_only = (df1[cols]
            .merge(df2, on=cols, indicator=True, how='right')
            .query('_merge == "right_only"').drop(columns='_merge')
           )

out = pd.concat([df1, df2_only])

将 df2 附加到 df1 并删除重复项

new=df1.append(df2).drop_duplicates(subset=['C1','C2'],keep='first')

打印(新)

 C1 C2 C3  V1
0  a  e  k   1
1  b  f  j   2
2  d  g  h   3
3  e  f  q   2
4  f  g  r   3