【问题标题】:Comparing two DataFrames in Pandas比较 Pandas 中的两个 DataFrame
【发布时间】:2017-10-30 16:29:52
【问题描述】:

大家好(我是 python 新手) 问题:如何比较两个具有相同索引但格式不同的 DataFrame。

以下是 DataFrame 的两个示例:

datum_von   datum_bis   NEG_00_04                     
2017-10-12  2017-10-12      21.69
2017-10-13  2017-10-13      11.85
2017-10-14  2017-10-14       7.83
2017-10-15  2017-10-15      14.64
2017-10-16  2017-10-16       5.11
2017-10-17  2017-10-17      12.09
2017-10-18  2017-10-18       8.47
2017-10-19  2017-10-19       6.34
2017-10-20  2017-10-20       7.68
2017-10-21  2017-10-21      13.40
2017-10-22  2017-10-22      25.53


datum_von   NEG_00_04  NEG_04_08  NEG_08_12  NEG_12_16  NEG_16_20  NEG_20_24                                                                 
2017-10-12      21.69      15.36       0.87       1.42       0.76       0.65   
2017-10-13      11.85       8.08       1.39       2.86       1.02       0.55   
2017-10-14       7.83       5.88       1.87       2.04       2.29       2.18   
2017-10-15      14.64      11.28       2.62       3.35       2.13       1.25   
2017-10-16       5.11       5.82       0.00       0.00       0.00       0.00   
2017-10-17      12.09       9.61       0.20       1.09       0.39       0.57   
2017-10-18       8.47       7.39       0.24       3.51       0.48       0.61 

请注意,它们具有相同的索引但列的名称不同(我尝试使用 d.columns = list_of_names 也没有用)

它们看起来不同但它们是相同的(包含相同的信息)但我没有复制所有数据。我想知道哪些值不同以及差异有多大

期望的输出:我想逐个单元格地计算两个日期框架值的差异我的意思是来自 d1 的单元格 [0][0] - 来自 df2 的单元格 [0][0]所有结果都在一个新的日期框架中

好的:我组织起来了,现在他们有一个相同的组织

dfres = res0.pivot(index='datum_von', columns='produktname')['max']

【问题讨论】:

  • 你想要的输出是什么?
  • 编辑感谢我真的不是特别的
  • 对不起,我迷路了——你想把所有的列都放在一列吗?将一个数据框中的所有相同列与另一个数据框中的所有相同列排列在一起?
  • @jezrael oki 我又试了一次,很抱歉我的问题风格不好
  • 好的,那么每个数据框都有不同的索引值和不同的列? df1 中有多个列?并且只想比较数据帧和相同列中的相同行?

标签: python pandas loops comparison


【解决方案1】:

使用的解决方案

使用更好:

dfres = res0.pivot(index='datum_von', columns='produktname', values='max')
dfdiff=dfres.sub(finaldf)

然后:

mask = dfdiff < 0
df = dfdiff.loc[mask.any(axis=1), mask.any()]]

如果与dfdiff 相同的列和索引值,也可以过滤原始数据帧:

dfa = dfres.loc[mask.any(axis=1), mask.any()]]
dfb = finaldf.loc[mask.any(axis=1), mask.any()]]

【讨论】:

  • 很好的解决方案!我想这是我一直在寻找的功能
  • 不确定是否理解 - product 是什么?一些专栏? Multiindex 的级别?
  • 我得到的值是正面的,而不仅仅是带有面具的负面值。那我怎么知道哪些大于零呢?
  • 我没有看到你的数据,所以很难回答。您认为为什么不将所有数据都输出为负数?如果是,那是因为使用数组。但不确定是否理解你,对不起。也许最好的办法是添加一些样本数据和所需的输出,或者用一些数据解释问题。
  • 你说的太对了!你的解决方案完美!非常感谢你现在学习面具
【解决方案2】:

我同意你应该更具体地说明你想要的输出,但它很可能会遵循这些路线

 cols_overlap = [ c for c in df1.columns if c in df2.columns]
 dfn = df1.merge(df2, how='inner', left_index=True, right_index=True, suffixes=('_df1','_df2'))

 for c in cols_overlap:
      print('%s' % c)
      print((dfm[c+'_df1']==dfm[c+'_df2'] ).all())

【讨论】:

    【解决方案3】:

    我用它来组织我的数据框以采用相同的格式

    dfres = res0.pivot(index='datum_von', columns='produktname')['max']
    

    然后我用它来计算差异

    dfdiff=dfres.subtract(finaldf)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多