【问题标题】:Show complete rows highliting difference between dataframes df1 , df2 , but only when difference in row's cell exists显示完整的行突出显示数据帧 df1 , df2 之间的差异,但仅当存在行单元格中的差异时
【发布时间】:2017-07-22 20:38:34
【问题描述】:

我有两个数据框 df1 和 df2。 相同的索引和相同的列名。 如何构建一个显示差异的数据框,但只有具有至少一个不同单元格的行? 如果行有不同的单元格,但有些相同,则保持相同的单元格不变。

示例:

df1=pd.DataFrame({1:['a','a'],2:['c','c']})
df2=pd.DataFrame({1:['a','a'],2:['d','c']})

需要输出:

pd.DataFrame({1:['a'],2:['c->d']},index=[0])

本例中的输出应该是一行数据帧,而不是包含相同行的数据帧

注意:输出应包含完整行,其中至少有一个单元格差异

我想要一个有效的解决方案,无需逐行迭代,也无需在 DataFrame 中创建特殊字符串

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用this brilliant solution:

    def report_diff(x):
        return x[0] if x[0] == x[1] else '{}->{}'.format(*x)
    
    In [70]: pd.Panel(dict(df1=df1,df2=df2)).apply(report_diff, axis=0)
    Out[70]:
       1     2
    0  a  c->d
    1  a     c
    

    对于更复杂的数据帧:

    In [73]: df1
    Out[73]:
       A  B  C
    0  a  c  1
    1  a  c  2
    2  1  2  3
    
    In [74]: df2
    Out[74]:
       A  B  C
    0  a  d  1
    1  a  c  2
    2  1  2  4
    
    In [75]: pd.Panel(dict(df1=df1,df2=df2)).apply(report_diff, axis=0)
    Out[75]:
       A     B     C
    0  a  c->d     1
    1  a     c     2
    2  1     2  3->4
    

    更新:仅显示更改/不同的行:

    In [54]: mask = df1.ne(df2).any(1)
    
    In [55]: mask
    Out[55]:
    0     True
    1    False
    2     True
    dtype: bool
    
    In [56]: pd.Panel(dict(df1=df1[mask],df2=df2[mask])).apply(report_diff, axis=0)
    Out[56]:
       A     B     C
    0  a  c->d     1
    2  1     2  3->4
    

    【讨论】:

    • 我喜欢。更多熊猫
    • 是的,我喜欢 report_diff 解决方案,但我希望我的输出数据框没有相同的行。我编辑了问题以突出显示它。数据框可以是 100MB,可以包含任何字符串或数字
    • @alexprice,请参阅更新
    【解决方案2】:

    如何对扁平内容进行良好的 ole 列表理解...

    import pandas as pd
    import numpy as np
    
    df1=pd.DataFrame({1:['a','a'],2:['c','c']})
    df2=pd.DataFrame({1:['a','a'],2:['d','c']})
    
    rows_different_mask = (df1 != df2).any(axis=1)
    
    pairs = zip(df1.values.reshape(1, -1)[0], df2.values.reshape(1, -1)[0])
    new_elems = ["%s->%s" %(old, new) if (old != new) else new for old, new in pairs]
    df3 = pd.DataFrame(np.reshape(new_elems, df1.values.shape))
    print df3
    
       0     1
    0  a  c->d
    1  a     c
    

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多