我正在尝试在应用分组功能后计算特定时间段内一个字段的总和。
我的数据集如下所示:
Date Company Country Sold
01.01.2020 A BE 1
02.01.2020 A BE 0
03.01.2020 A BE 1
03.01.2020 A BE 1
04.01.2020 A BE 1
05.01.2020 B DE 1
06.01.2020 B DE 0
我想在每行添加一个新列,用于计算过去 7 天的销售总和(每个组“公司、国家/地区” - 不包括当天
Date Company Country Sold LastWeek_Count
01.01.2020 A BE 1 0
02.01.2020 A BE 0 1
03.01.2020 A BE 1 1
03.01.2020 A BE 1 1
04.01.2020 A BE 1 3
05.01.2020 B DE 1 0
06.01.2020 B DE 0 1
我尝试了以下操作,但它还包括当前日期,并且它为同一日期提供了不同的值,即 03.01.2020
df['LastWeek_Count'] = df.groupby(['Company', 'Country']).rolling(7, on ='Date')['Sold'].sum().reset_index()
pandas 中有内置函数可以用来执行这些计算吗?
最佳答案
您可以使用 8
的 .rolling
窗口,然后减去日期的总和(对于每个分组的行)以有效获取前 7 天。对于此示例数据,我们还应该传递 min_periods=1
(否则您将得到 NaN
值,但对于您的实际数据集,您需要决定要做什么窗口为 <8
)。
然后从 8
的 .rolling
窗口中,只需对相关列执行另一个 .groupby
操作,但还包括 Date
这次,并获取新创建的 LastWeek_Count
列的 max
值。您需要获取最大值
,因为您每天有多个记录,因此通过获取最大值,您将获取每个日期
的总聚合金额。
然后,创建一个按日期
的总和
分组的系列。在最后一步中,从滚动 8 天最大值中减去按日期计算的总和,这是获取前 7 天总和的解决方法,因为 .rolling< 没有用于偏移量的参数
:
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
df['LastWeek_Count'] = df.groupby(['Company', 'Country']).rolling(8, min_periods=1, on='Date')['Sold'].sum().reset_index()['Sold']
df['LastWeek_Count'] = df.groupby(['Company', 'Country', 'Date'])['LastWeek_Count'].transform('max')
s = df.groupby(['Company', 'Country', 'Date'])['Sold'].transform('sum')
df['LastWeek_Count'] = (df['LastWeek_Count']-s).astype(int)
Out[17]:
Date Company Country Sold LastWeek_Count
0 2020-01-01 A BE 1 0
1 2020-01-02 A BE 0 1
2 2020-01-03 A BE 1 1
3 2020-01-03 A BE 1 1
4 2020-01-04 A BE 1 3
5 2020-01-05 B DE 1 0
6 2020-01-06 B DE 0 1
关于Pandas groupby 和滚动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63514200/