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

时间:2018-08-31 05:54:08

标签: python pandas equality

我正在测试数据框是否相等。

df_diff=(df1!=df2)

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

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

   df1=[df_diff.values]

我得到了所有,其中True中至少有一个df_diff,但是许多列原本只有False

第二步,我希望能够用df_diff==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

1 个答案:

答案 0 :(得分:2)

我认为您需要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添加NaN

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