【问题标题】:Pandas: Getting a rolling sum while grouping by a column熊猫:按列分组时获得滚动总和
【发布时间】:2016-02-20 21:55:01
【问题描述】:

我有一个看起来像的熊猫数据框

Name    Date               Value
Sarah   11-01-2015         3
Sarah   11-02-2015         2
Sarah   11-03-2015         27
Bill    11-01-2015         42
Bill    11-02-2015         5
Bill    11-03-2015         15
.... (a couple hundred rows)

如何获得这些值的 30 天(或 x 天)滚动总和,由“名称”列中的任何人分列?理想的输出将具有与当前数据框相同的列,但不是将每一行的值作为该人当天的值,而是将其在过去 30 天内的值的累积总和。

我知道我能做到

result = pd.rolling_sum(df, 30)

获得整体的滚动总和。但是如何返回按“名称”列分组的滚动总和的数据框?

【问题讨论】:

  • 就在几天前,有一个 bounty question 用于类似(几乎完全)的 python 滚动总和,但过去 7 天。我的回答建议使用 SQL 来执行此操作,并避免让 pandas 在内存中对其进行重组。如果您的数据框来自数据库,请考虑这样的路线。
  • 啊,感谢@Parfait 的提醒!

标签: python pandas dataframe rolling-sum


【解决方案1】:

使用 grigri group_resample 函数解决了这个问题。

df = group_resample(df,date_column='Date',groupby=group_by,value_column='Value',how='sum',freq='d')
df = df.unstack(group_by).fillna(0)
result = pd.rolling_mean(df,30)

【讨论】:

    【解决方案2】:

    请注意,如果您不需要精确的时间窗口,或者如果您的数据集每个 [day , user] 有 1 行(这似乎是您的情况),那么 pandas 的标准 groupby 非常适合。见this very similar question

    否则,类似:

    df.groupby('Name').rolling('30D', on="Date").Value.sum()

    应该可以。

    【讨论】:

    • 最好用你提供的链接报告这个问题:)
    猜你喜欢
    • 2021-04-24
    • 2017-02-16
    相关资源
    最近更新 更多