熊猫groupby和滚动窗口

时间:2020-08-20 22:54:07

标签: 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()

大熊猫中是否有内置函数可用于执行这些计算?

2 个答案:

答案 0 :(得分:1)

您可以使用.rolling的{​​{1}}窗口,然后减去Date的总和(对于每个分组行)以有效获得前7天。对于此示例数据,我们还应该传递8(否则,您将获得min_periods=1值,但是对于您的实际数据集,您需要决定要使用<{{1 }}。

然后从NaN的{​​{1}}窗口中,简单地进行相关列中的另外8,但这次也包含.rolling,并取8新创建的.groupby列的值。您需要记录Date,因为每天您有多条记录,因此,取最大值,您将获取每个max的总合计金额。

然后,创建一个按LastWeek_Countmax分组的系列。在最后一步中,从滚动的8天最大值中减去按日期计算的总和,这是解决方法,您可以获取前7天的总和,因为没有用于Date的偏移量参数:

sum

答案 1 :(得分:0)

一种方法是首先使用临时DF在一行上合并每个组(['日期','公司','国家/地区]]的已出售值。
之后,将.groupby.rolling一起应用,间隔为8​​行。
计算完总和后,用 Sold 列中的值减去每行的值,然后使用.merge

将该列添加到原始DF中
#convert Date column to datetime
df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%Y')
#create a temporary DataFrame
df2 = df.groupby(['Date', 'Company', 'Country'])['Sold'].sum().reset_index()
#calc the lastweek
df2['LastWeek_Count'] = (df2.groupby(['Company', 'Country'])
                            .rolling(8, min_periods=1, on = 'Date')['Sold']
                            .sum().reset_index(drop=True)
                        ) 
#subtract the value of 'lastweek' from the current 'Sold'
df2['LastWeek_Count'] = df2['LastWeek_Count'] - df2['Sold']
#add th2 new column in the original DF
df.merge(df2.drop(columns=['Sold']), on = ['Date', 'Company', 'Country'])
#output:
    Date        Company Country Sold    LastWeek_Count
0   2020-01-01  A       BE      1       0.0
1   2020-01-02  A       BE      0       1.0
2   2020-01-03  A       BE      1       1.0
3   2020-01-03  A       BE      1       1.0
4   2020-01-04  A       BE      1       3.0
5   2020-01-05  B       DE      1       0.0
6   2020-01-06  B       DE      0       1.0