我尝试在应用分组功能后的特定时间段内计算一个字段的总和。
我的数据集如下:
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()
大熊猫中是否有内置函数可用于执行这些计算?
答案 0 :(得分:1)
您可以使用.rolling
的{{1}}窗口,然后减去Date的总和(对于每个分组行)以有效获得前7天。对于此示例数据,我们还应该传递8
(否则,您将获得min_periods=1
值,但是对于您的实际数据集,您需要决定要使用<{{1 }}。
然后从NaN
的{{1}}窗口中,简单地进行相关列中的另外8
,但这次也包含.rolling
,并取8
新创建的.groupby
列的值。您需要记录Date
,因为每天您有多条记录,因此,取最大值,您将获取每个max
的总合计金额。
然后,创建一个按LastWeek_Count
按max
分组的系列。在最后一步中,从滚动的8天最大值中减去按日期计算的总和,这是解决方法,您可以获取前7天的总和,因为没有用于Date
的偏移量参数:
sum
答案 1 :(得分:0)
一种方法是首先使用临时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', '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