比较 2 个 pandas.DataFrame,获取差异并仅打印与第一个相比发生变化的行

问题描述 投票:0回答:4

我有 2 个数据框,我将它们与下面的代码片段进行比较:

df3 = pandas.concat([df1, df2]).drop_duplicates(keep=False)

它工作正常,它比较两者,作为输出,我得到了与它们都不同的行。

我想要实现的是比较两个数据帧以获取不同的行,但作为输出仅获取/保留第一个数据帧中的行。

有没有简单的方法可以做到这一点?

python pandas
4个回答
1
投票

我会用

~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()

0
投票

如果您只想要第一个数据帧中的唯一行,那么您确实需要左连接。

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

0
投票

一种方法是用数字预先标记 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

0
投票

使用

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()

© www.soinside.com 2019 - 2024. All rights reserved.