最近 n_days 使用 groupby 在特定列上的累积总和
Posted
技术标签:
【中文标题】最近 n_days 使用 groupby 在特定列上的累积总和【英文标题】:Cumulative sum on specific column with groupby on last n_days 【发布时间】:2020-09-22 18:25:56 【问题描述】:我正在尝试对 last_n
行的列执行滚动求和,并转换为数据框中的新列,并按不同的列分组。所以这是我拥有的数据框类型的示例:
id. a. b. c. date.
01 0 abc def 1/22/20
01 2 abc def 1/23/20
01 1 abc def 1/24/20
01 1 abc def 1/25/20
02 4 abc def 1/22/20
02 5 abc def 1/23/20
02 5 abc def 1/24/20
02 0 abc def 1/25/20
03 1 abc def 1/22/20
03 0 abc def 1/23/20
03 2 abc def 1/24/20
03 2 abc def 1/25/20
.
.
.
这些是任意值,但假设我想对每个id
在column=a.
的过去 2(示例)天进行滚动求和。输出应如下所示:
如果过去的 n
天不存在,只需将 0
添加到累计总和中。
id. a. b. c. date. rolling_2_a
01 0 abc def 1/22/20 0
01 2 abc def 1/23/20 2
01 1 abc def 1/24/20 3
01 1 abc def 1/25/20 2
02 4 abc def 1/22/20 4
02 5 abc def 1/23/20 9
02 5 abc def 1/24/20 10
02 0 abc def 1/25/20 5
03 1 abc def 1/22/20 1
03 0 abc def 1/23/20 1
03 2 abc def 1/24/20 2
03 2 abc def 1/25/20 4
.
.
.
我知道如何根据 id 进行求和,但在这里使用日期元素 + last_n
要求,我不确定 pandas
是否具有该功能。
为此,我们假设date
列也可能未排序,但两者的示例将不胜感激。
【问题讨论】:
【参考方案1】:重症监护室
#Coerce date to datetime
df['date.']=pd.to_datetime(df['date.'])
#Set date as index
df.set_index('date.', inplace=True)
#Group by id
df['rolling_2_a']=df.groupby(df['id.'])['a.'].transform(lambda x: x.rolling('2D').sum()).fillna(0)
【讨论】:
我在.rolling('2D')
上收到了ValueError: window must be an integer
,但将其更改为.rolling(2)
似乎可行。你能解释一下发生了什么吗?同样在这种情况下,是考虑当天还是对n-2
求和?
来自文档pandas.pydata.org/pandas-docs/stable/reference/api/… '2' 将为您提供窗口长度为 2 的 Rolling sum,min_periods 默认为窗口长度。 2D 将为您提供最短周期。我的解决方案应该有效。确保将日期设置为日期时间,并在将其强制为日期时间后将其设置为索引。然后使用 groupby
啊,是的,我以为我的专栏已经在日期时间了,这就是问题所在。谢谢!我不明白窗口长度和“2D”最小周期之间的区别,任何输入都表示赞赏以上是关于最近 n_days 使用 groupby 在特定列上的累积总和的主要内容,如果未能解决你的问题,请参考以下文章
pandas groupby 按总和聚合特定列,按最常见值聚合其他列