我有以下非常基本的df:
df1:
A B
0 1 4
1 2 5
2 3 6
df2:
A B
0 1 4
1 2 7
2 3 6
我想对它们进行比较,结果只显示存在差异的行/列,但我还需要知道原始df的外观,以便跟踪差异的原因。预期输出应为:
A_df1 B_df1 A_df2 B_df2
1 2 5 2 7
在执行这种差异比较/外部连接时,我总是使用下面的标准代码:
pd.merge(df1, df2, how='outer')
pd.concat([df1, df2]).drop_duplicates(keep=False)
使用concat和drop_duplicates组合是很好的,但是,它不允许我并排查看差异来自哪里-它只显示我的差异,我需要一个接一个地跟踪它们。
我试着在下面的列中添加前缀,这是有意义的:
df1_with_suffix = df1.add_suffix('_df1')
df2_with_suffix = df2.add_suffix('_df2')
然而,我不明白为什么当我执行concat/drop_duplicates时,我继续获得所有数据-即。重复项没有被丢弃?
4条答案
按热度按时间tf7tbtn21#
按照您的方法,您可以添加
unstack
以进行 * 并排 * 比较:输出:
7d7tgy0s2#
您可以尝试:
xpcnnkqh3#
我没有正确理解你的问题。首先,我想说
concat
和drop_duplicates
并不适合你要做的事情。你的代码问题:在同一数据框中重复(例如DF1)也被移除。
使用以下代码:
输出:
如果你还需要什么,请详细解释,我会帮你的。
m2xkgtsf4#
当你做
df1.add_suffix('_df1')
和df2.add_suffix('_df2')
时,有4列要比较,例如,A_df1
和A_df2
被认为是不同的列,所以不会有重复的行。我喜欢你的
pd.concat()
和drop_duplicates()
的组合,这是伟大的!但是,您可以继续对索引进行排序,然后将奇数行与偶数行并排连接起来,例如
输出
请注意,行索引
1
被保留,因此您可以返回到df1
和df2
来查找该索引中的差异。