pandas df与duplicates_dropped的并排比较

fcipmucu  于 2023-05-05  发布在  其他
关注(0)|答案(4)|浏览(154)

我有以下非常基本的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时,我继续获得所有数据-即。重复项没有被丢弃?

tf7tbtn2

tf7tbtn21#

按照您的方法,您可以添加unstack以进行 * 并排 * 比较:

out = (pd.concat([df1, df2], keys=["df1", "df2"])
           .drop_duplicates(keep=False).unstack(0).sort_index(axis=1, level=1)
           .pipe(lambda x: x.set_axis(x.columns.map("{0[0]}_{0[1]}".format), axis=1)))
​

输出:

print(out)

   A_df1  B_df1  A_df2  B_df2
1      2      5      2      7
7d7tgy0s

7d7tgy0s2#

您可以尝试:

details = {
    'a' : [1, 2, 3, 4],
    'Age_a' : [23, 21, 22, 21]}

df = pd.DataFrame(details)
  
details_2 = {'a' : [1, 2, 3, 4],
    'Age_b' : [23, 21, 100, 21]}

df2 = pd.DataFrame(details_2)
df_all = pd.merge(df, df2[['a', 'Age_b']], on = ['a'], how='left')
df_all = df_all.loc[(df_all['Age_a'] - df_all['Age_b']) != 0 ]

 #   a  Age_a   Age_b
 #   2  3   22  100
xpcnnkqh

xpcnnkqh3#

我没有正确理解你的问题。首先,我想说concatdrop_duplicates并不适合你要做的事情。
你的代码问题:在同一数据框中重复(例如DF1)也被移除。
使用以下代码:

cond1 = ~df1.eq(df2).all(axis=1)
pd.concat([df1.add_suffix('_df1')[cond1], df2.add_suffix('_df2')[cond1]], axis=1)

输出:

A_df1 B_df1 A_df2 B_df2
1     2     5     2     7

如果你还需要什么,请详细解释,我会帮你的。

m2xkgtsf

m2xkgtsf4#

当你做df1.add_suffix('_df1')df2.add_suffix('_df2')时,有4列要比较,例如,A_df1A_df2被认为是不同的列,所以不会有重复的行。
我喜欢你的pd.concat()drop_duplicates()的组合,这是伟大的!
但是,您可以继续对索引进行排序,然后将奇数行与偶数行并排连接起来,例如

import pandas as pd

df1 = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]})
df2 = pd.DataFrame({'A': [1,2,3], 'B': [4,7,6]})

df = pd.concat([df1, df2]).drop_duplicates(keep=False).sort_index()
output = pd.concat([df.add_suffix('_df1').iloc[::2], df.add_suffix('_df2').iloc[1::2]], axis=1)
print(output)

输出

A_df1  B_df1  A_df2  B_df2
1      2      5      2      7

请注意,行索引1被保留,因此您可以返回到df1df2来查找该索引中的差异。

相关问题