我正在测试数据框是否相等。
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
答案 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