Pandas groupby 和滚动窗口

标签 pandas dataframe pandas-groupby

我正在尝试在应用分组功能后计算特定时间段内一个字段的总和。

我的数据集如下所示:

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/

相关文章:

python - 分组并填充缺失的日期时间值

python - 如何过滤数据框中一列中有整数的行

pandas - 每周计数 - 唯一列值的出现次数,并显示最大计数

python - 获取列的 [0, x] 元素的最小值

python - 在 pandas groupby 中对多行进行操作

python - pandas数据帧减法结果具有行和数据类型信息

r - 创建组 ID 序列但省略特定行

python - 按 Pandas 组顺序计算差异

python - 使用 pandas 计算平均值时排除列中的零

以列为字典的 Pandas 数据透视表