如何比较两个数据框并过滤发现差异的行和列
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
添加 NaN
s:
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
我正在测试数据帧的平等性。
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
添加 NaN
s:
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