【问题标题】:Pandas sum-lag of a columnPandas 列的总和滞后
【发布时间】:2019-06-01 01:48:52
【问题描述】:

假设我有这样的数据

df = pd.DataFrame({"MONTHS":[1,2,3,4,5,6], "METRIC":[430,584,648,571,610,535]})

df = pd.DataFrame({"MONTHS":[1,2,3,4,5,6], "METRIC":[430,584,648,571,610,535]}) 我想要做的是找到指标列的总和=3378

MONTHS NEW_METRIC
 0       3378
 1       3378
 2       2948
 3       2794
 4       2730
 5       2807
 6       2768

所以这里基本上创建了一个添加 0 的新行,相应的新指标是总和,对于值 1,它也是新指标的总和,但从月 = 2 中它应该减去指标的滞后值 (3378-430 ) 并且类似地在几个月内 3 将是 (3378-584) 等,直到最后。 作为第一步,我想将总和存储在失败的结果中

sum_METRIC = df.agg({"METRIC":"sum"}).collect()[0]
result = sum_METRIC["sum(METRIC)"]

这个抛出的错误“系列”对象没有“收集”属性。

我如何求和然后使用滞后减去?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    您可以减去 METRIC 得到的总和:

    In [11]: df["METRIC"].sum() - df["METRIC"].reindex(np.arange(0, 7)).shift(2).fillna(0)
    Out[11]:
    0    3378.0
    1    3378.0
    2    2948.0
    3    2794.0
    4    2730.0
    5    2807.0
    6    2768.0
    Name: METRIC, dtype: float64
    

    【讨论】:

    • 不确定是否需要reindex
    • @QuangHoang 没有重新索引,您不会从 MONTHS 0 开始,这在预期的 OP 中。但是,是的,也许没有必要......
    • 我认为reindex 可以根据 OP 的需要添加额外的行。除了reindex,还有其他更短的方法来创建一个额外的行吗?
    • @AndyHayden- 谢谢- 但是有没有办法动态地说 df 长度而不是 7 (length+1)?
    • @AndyHayden 感谢刚刚意识到用 len(df)+1 代替 7 也可以工作
    【解决方案2】:

    使用

    df['New']=df["METRIC"].sum() - np.array([0,0]+df["METRIC"].tolist())[:len(df)]
    df
    Out[307]: 
       MONTHS  METRIC   New
    0       1     430  3378
    1       2     584  3378
    2       3     648  2948
    3       4     571  2794
    4       5     610  2730
    5       6     535  2807
    

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2019-06-18
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多