[英]Conditional sum across rows in pandas groupby statement
我有一個數據框,其中包含不同產品(a,b,c)的每周銷售額:
In[1]
df = pd.DataFrame({'product': list('aaaabbbbcccc'),
'week': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],
'sales': np.power(2, range(12))})
Out[1]
product sales week
0 a 1 1
1 a 2 2
2 a 4 3
3 a 8 4
4 b 16 1
5 b 32 2
6 b 64 3
7 b 128 4
8 c 256 1
9 c 512 2
10 c 1024 3
11 c 2048 4
我想創建一個新列,其中包含過去n周內按產品分組的累計銷售額。 例如,對於n=2
它應該類似於last_2_weeks
:
product sales week last_2_weeks
0 a 1 1 0
1 a 2 2 1
2 a 4 3 3
3 a 8 4 6
4 b 16 1 0
5 b 32 2 16
6 b 64 3 48
7 b 128 4 96
8 c 256 1 0
9 c 512 2 256
10 c 1024 3 768
11 c 2048 4 1536
我怎樣才能有效地計算出這種累積的有條件的熊貓總數? 如果還有更多變量要分組,例如產品和位置,則該解決方案也應該起作用。
我嘗試創建一個新函數並使用groupby
和apply
,但這僅在對行進行排序時有效。 而且它又慢又丑。
def last_n_weeks(x):
""" calculate sales of previous n weeks in aggregated data """
n = 2
cur_week = x['week'].iloc[0]
cur_prod = x['product'].iloc[0]
res = np.sum(df['sales'].loc[((df['product'] == cur_prod) &
(df['week'] >= cur_week-n) & (df['week'] < cur_week))])
return res
df['last_2_weeks'] = df.groupby(['product', 'week']).apply(last_n_weeks).reset_index(drop=True)
您可以使用window=2
pd.rolling_sum
,然后shift
一次並用0
填充NaNs
In [114]: df['l2'] = (df.groupby('product')['sales']
.apply(lambda x: pd.rolling_sum(x, window=2, min_periods=0)
.shift()
.fillna(0)))
In [115]: df
Out[115]:
product sales week l2
0 a 1 1 0
1 a 2 2 1
2 a 4 3 3
3 a 8 4 6
4 b 16 1 0
5 b 32 2 16
6 b 64 3 48
7 b 128 4 96
8 c 256 1 0
9 c 512 2 256
10 c 1024 3 768
11 c 2048 4 1536
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.