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
我有 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