我有 2 个数据框,我将它们与下面的代码片段进行比较:
df3 = pandas.concat([df1, df2]).drop_duplicates(keep=False)
它工作正常,它比较两者,作为输出,我得到了与它们都不同的行。
我想要实现的是比较两个数据帧以获取不同的行,但作为输出仅获取/保留第一个数据帧中的行。
有没有简单的方法可以做到这一点?
我会用
~isin()
:
df.set_index(list(df.columns), inplace=True)
df2.set_index(list(df2.columns), inplace=True)
df[~df.index.isin(df2.index)].reset_index()
如果您只想要第一个数据帧中的唯一行,那么您确实需要左连接。
df3 = df1.merge(df2.drop_duplicates(), on='your_column_here',
how='left', indicator=True)
现在您可以检查
_merge
列并仅筛选左侧:
col1 col2 _merge
0 1 10 both
1 2 11 both
2 3 12 both
3 4 13 left_only
4 5 14 left_only
5 3 10 left_only
一种方法是用数字预先标记 df 的行(如
.assign(mark=1)
)并在之后删除辅助列
df1 = pd.DataFrame(np.random.randint(-10, 10, 20)) # dummy data
df2 = pd.DataFrame(np.random.randint(-10, 10, 20)) # dummy data
df3 = pd.concat([df1.assign(mark=1), df2.assign(mark=2)]).drop_duplicates(keep=False)
print(df3[df3['mark'].eq(1)].drop(columns='mark'))
打印:
0
2 -6
3 -8
14 3
16 -3
使用
compare()
:
data1 = {
'A': [1, 2, 3, 4],
'B': ['a', 'b', 'c', 'd']
}
current = pd.DataFrame(data1)
data2 = {
'A': [1, 2, 4, 4], # Changed value in row 2
'B': ['a', 'x', 'c', 'd'] # Changed value in row 1
}
new = pd.DataFrame(data2)
# Compare the two DataFrames
comparison = current.compare(new, keep_shape=True)
# Get rows with any truthy value (compare() sets unchanged values to NaN)
changed = comparison.notna().any(axis=1)
print(new[changed])
结果是:
A B
1 2 x
2 4 c
如果您想要行名称,可以执行
list(new[changed].index)
或 new[changed].index.to_list()