如何比较两个数据框并过滤发现差异的行和列

How to compare two dataframes and filter rows and columns where a difference is found

我正在测试数据帧的平等性。

df_diff=(df1!=df2)

我得到 df_diff,它的形状与 df* 相同,并且包含布尔值 True/False

现在我只想保留 df1 的列和行,其中至少有一个不同的值。 如果我只是做

   df1=[df_diff.values]

我得到了所有 ,其中 df_diff 中至少有一个 True,但很多列最初只有 False .

作为第二步,我希望能够用 NaNs.

示例:

df1=pd.DataFrame(data=[[1,2,3],[4,5,6],[7,8,9]])
df2=pd.DataFrame(data=[[1,99,3],[4,5,99],[7,8,9]])

我想从df1

   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

    1  2
0  2  NaN  
1  NaN  6

我认为你需要 DataFrame.any 来检查每行列至少一个 True:

df = df_diff[df_diff.any(axis=1)]

可以像这样过滤两个原始数据帧:

df11 = df1[df_diff.any(axis=1)]
df22 = df2[df_diff.any(axis=1)]

如果想要所有列和行:

df = df_diff.loc[df_diff.any(axis=1), df_diff.any()]

编辑:过滤 d1 并通过 where 添加 NaNs:

df_diff=(df1!=df2)

m1 = df_diff.any(axis=1)
m2 = df_diff.any()

out = df1.loc[m1, m2].where(df_diff.loc[m1, m2])
print (out)
     1    2
0  2.0  NaN
1  NaN  6.0