代码之家  ›  专栏  ›  技术社区  ›  00__00__00

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

  •  2
  • 00__00__00  · 技术社区  · 8 年前

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

    df_diff=(df1!=df2)
    

    我明白了 df_diff 它的形状和 df* ,并包含布尔值 True/False .

    现在我只想保留 df1 如果我这么做

       df1=[df_diff.values]
    

    至少有一个 True 数据框差异 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]])
    

    我想从

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

        1  2
    0  2  NaN  
    1  NaN  6
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   jezrael    8 年前

    我想你需要 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 并添加 NaN s由 where :

    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