【问题标题】:Calculate grouped rolling cumulative sum with multiplier用乘数计算分组滚动累积和
【发布时间】:2020-08-07 09:04:47
【问题描述】:

我想在 Pandas DataFrame 中将一列乘以一个常数后计算滚动累积总和。例如,给定系列:

0
0
1
0
0
0

我想应用一个常数倍数,例如 1.5,来累积计算以下系列:

0
0
1
1.5
2.25
3.375

序列需要在一个组上计算,例如:

pd.DataFrame({'Group': ['a', 'a', 'a', 'a', 'b', 'b'], 'Value': [0, 0, 1, 0, 0, 0]})

应该分别计算ab

该系列将只包含01 作为值,而1 在该系列中只会出现一次。因此,一个序列之前的总和是1

【问题讨论】:

  • 如果系列是[0, 0, 1, 0, 1, 0]会发生什么?
  • 好问题 ASGM,我应该在问题中说明这一点。这在数据集中是不可能的。

标签: python pandas


【解决方案1】:

这是一个单行代码,但它在同一 Value 列中生成输出,因为它只有 01 乘以 1 time x0 + x 相同

df.iloc[df.Value.idxmax()+1:, df.columns == 'Value'] =
    (df.iloc[df.Value.idxmax()+1:, df.columns == 'Value']+1.5).cumprod()

df.Value
#   Value
# 0 0.0
# 1 0.0
# 2 1.0
# 3 1.5
# 4 2.25
# 5 3.375

编辑

如果这需要仅应用于特定组,则最好创建一个函数

def fun(df_g):
    df = df_g.copy()
    df.iloc[df.Value.idxmax()+1:, df.columns == 'Value'] = 
        (df.iloc[df.Value.idxmax()+1:, df.columns == 'Value']+1.5).cumprod()
    return df.Value

df_result = df.groupby('Group').apply(fun).\
    transform(pd.Series).reset_index(level=1, drop=True)

df_result
# Group 0
# a 0.0
# a 0.0
# a 1.0
# a 1.5
# b 0.0
# b 0.0

【讨论】:

  • 能不能转换成OP可以按组申请的功能?如果不能,我可以,但不想不必要地干涉。
  • 感谢@ASGM 更好地提供这两种解决方案。
猜你喜欢
  • 2013-02-24
  • 2019-07-01
  • 2018-12-29
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多