【问题标题】:Comparing two dateframes and setting values比较两个数据框和设置值
【发布时间】:2018-04-14 23:43:37
【问题描述】:

我有一个问题,我不确定应该使用什么函数来执行它。我有两个日期框架,如果一个(finaldf)中的值高于另一个(dfres0)中的值,并且如果它们是我想在(finaldf)中设置为零,我想两个比较。以下是此日期框架的示例:

finaldf

..             NEG_00_04  NEG_04_08  NEG_08_12  NEG_12_16  NEG_16_20  NEG_20_24  \
datum_von                                                                      
2017-10-18       9.58       8.08       0.39       2.32       0.54       0.60   
2017-10-19       6.34       6.20       0.15       1.32       0.46       0.56   
2017-10-20       7.68       5.86       0.29       1.04       0.48       0.54   
2017-10-21      13.40      10.52       2.50       3.09       2.97       2.44   
2017-10-22      25.53      17.33       4.05      12.62       2.35       1.14

dfres0

... produktname  NEG_00_04  NEG_04_08  NEG_08_12  NEG_12_16  NEG_16_20  NEG_20_24  \
datum_von                                                                       
2017-10-18      12.440     11.012      0.604      4.189      0.900      0.912   
2017-10-19      10.144      8.880      0.465      2.700      0.740      0.832   
2017-10-20      10.370      8.280      0.394      1.970      0.694      0.732   
2017-10-21      14.207     10.800      1.940      2.940      2.334      2.164   
2017-10-22      24.750     20.285      3.900     18.241      2.476      1.870 

提前致谢

【问题讨论】:

  • 可以print (finaldf == dfres0) 吗?
  • @jezrael 如果它们相等,则应保持与日期框架 finaldf 中的值相同
  • 我有疑问返回 boolean maskValueError: Can only compare identically-labeled DataFrame objects
  • @jezrael 比较主要是为了知道 finaldf 中的哪些值会高于 dfres0 中的值,因此可以创建一个新的 finaldf ,其值设置为零。它们确实具有相同的长度和信息,但可能在 finaldf 中缺少一个列名作为 prodktname

标签: python pandas loops series


【解决方案1】:

如果两个DataFrame 具有相同的索引和列值并且所有数据都是数字使用mask

df = finaldf.mask(finaldf > dfres0, 0)
print (df)
            NEG_00_04  NEG_04_08  NEG_08_12  NEG_12_16  NEG_16_20  NEG_20_24
datum_von                                                                   
2017-10-18       9.58       8.08       0.39       2.32       0.54       0.60
2017-10-19       6.34       6.20       0.15       1.32       0.46       0.56
2017-10-20       7.68       5.86       0.29       1.04       0.48       0.54
2017-10-21      13.40      10.52       0.00       0.00       0.00       0.00
2017-10-22       0.00      17.33       0.00      12.62       2.35       1.14

详情:

print (finaldf > dfres0)
            NEG_00_04  NEG_04_08  NEG_08_12  NEG_12_16  NEG_16_20  NEG_20_24
datum_von                                                                   
2017-10-18      False      False      False      False      False      False
2017-10-19      False      False      False      False      False      False
2017-10-20      False      False      False      False      False      False
2017-10-21      False      False       True       True       True       True
2017-10-22       True      False       True      False      False      False

编辑:

如果列相同,唯一的区别是 dfres0 中的 produktname 列,然后先将其删除:

df = finaldf.mask(finaldf > dfres0.drop('produktname', axis=1), 0)

【讨论】:

  • 我从你身上学到了很多东西!我一直在想解决问题的难点,但 python 总是有一个更容易的问题。非常感谢您回答我的问题。我真的很感激
  • 只有一个问题,我还能以某种方式将 dfres0 中的列的索引设置为 produktname 吗?所以他们在两个日期框架中都有相同的名字
  • 使用finaldf = finaldf.set_index(dfres0['produktname'], append=True),然后使用df = finaldf.mask(finaldf > dfres0.set_index('produktname', append=True), 0)
  • 实际上我做了以下事情; finaldf.columns.name = 'produktname' 并且有效。 =]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
相关资源
最近更新 更多