【问题标题】:Subtract two unbalanced DataFrames in Pandas在 Pandas 中减去两个不平衡的 DataFrame
【发布时间】:2017-10-09 16:59:49
【问题描述】:

我有两个不平衡的 DataFrame,想通过减去值来创建第三个,以获得它们之间的增量。这是三个数据框的示例。我想用 CURRENT 减去相应的 EXPECTED 得到 DELTA。这可以按预期工作,并且当 CURRENT 和 EXPECTED 中的值存在时,我会在 DELTA 中产生正确的结果。但是,当它们不存在时,我会在 DELTA 中得到 NaN。当我希望它如下所示:

      CURRENT
      Region1    Region2
type1   5          3
type2   2          11
type3   7          1

      EXPECTED
      Region1    Region2
type1   15         1
type2   6          4

      DELTA
      Region1    Region2
type1   -10        2
type2   -4         7
type3   7          1

使用我当前的代码,DELTA 中的 type3 行是 NaN,NaN。

def get_delta(self, CURRENT, EXPECTED):
    delta = CURRENT
    delta['Region1'] = current[['Region1']] - \
                              expected[['Region1']]
    delta['Region2'] = current[['Region2']] - \
                              expected[['Region2']]
    return delta

我尝试检查是 delta.isnull() 还是 delta.empty,但这不起作用。本质上,我想将 EXPECTED 中任何不存在的值视为 0,然后只需执行减法 CURRENT - RESERVED 即可获得 DELTA。我想我可以通过将任何 NaN 视为 0 来做到这一点,或者将缺失的行填充到 EXPECTED 中,并将正确的行/索引设为 0。

我试过了:

new_df = pd.concat([CURRENT, EXPECTED], axis=1).fillna(0)

然后从那里减去,但是当我尝试 concat 时出现错误“ValueError:形状不匹配:形状 (0,13) 的值数组无法广播到形状 (1,13) 的索引结果”所以不知道那里发生了什么。

【问题讨论】:

    标签: python pandas dataframe isnull


    【解决方案1】:

    你需要DataFrame.sub和参数fill_value=0

    DELTA = CURRENT.sub(EXPECTED, fill_value=0)
    print (DELTA)
           Region1  Region2
    type1    -10.0      2.0
    type2     -4.0      7.0
    type3      7.0      1.0
    

    【讨论】:

    • 谢谢!这正是我所需要的,并允许我从我的代码中删除整个 delta 函数。
    【解决方案2】:

    使用reindex

    In [217]: CURRENT - EXPECTED.reindex(CURRENT.index, fill_value=0)
    Out[217]:
           Region1  Region2
    type1      -10        2
    type2       -4        7
    type3        7        1
    

    详情

    In [218]: CURRENT
    Out[218]:
           Region1  Region2
    type1        5        3
    type2        2       11
    type3        7        1
    
    In [219]: EXPECTED
    Out[219]:
           Region1  Region2
    type1       15        1
    type2        6        4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-14
      • 2019-06-29
      • 2016-02-18
      • 2015-04-09
      • 1970-01-01
      • 2020-01-05
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多