如何解决熊猫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()
大熊猫中是否有内置函数可用于执行这些计算?
解决方法
您可以使用.rolling
的{{1}}窗口,然后减去Date的总和(对于每个分组行)以有效获得前7天。对于此示例数据,我们还应该传递8
(否则,您将获得min_periods=1
值,但是对于您的实际数据集,您需要决定要使用
然后从NaN
的{{1}}窗口中,简单地进行相关列中的另外8
,但这次也包含.rolling
,并取8
新创建的.groupby
列的值。您需要记录Date
,因为每天您有多条记录,因此,取最大值,您将获取每个max
的总合计金额。
然后,创建一个按LastWeek_Count
按max
分组的系列。在最后一步中,从滚动的8天最大值中减去按日期计算的总和,这是解决方法,您可以获取前7天的总和,因为没有用于Date
的偏移量参数:
sum
,
一种方法是首先使用临时DF在一行上合并每个组(['日期','公司','国家/地区]]的已出售值。
之后,将.groupby
与.rolling
一起应用,间隔为8行。
计算完总和后,用 Sold 列中的值减去每行的值,然后使用.merge
#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','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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。