[英]Conditional sum from rows into a new column in pandas
我正在根據行中的值在panda中創建一個新列。 我的樣本數據:
df=pd.DataFrame({"A":['a','a','a','a','a','a','b','b','b'],
"Sales":[2,3,7,1,4,3,5,6,9,10,11,8,7,13,14],
"Week":[1,2,3,4,5,11,1,2,3,4])
我想要一個對應於每周的新列“ Last3WeekSales”,其中包含前3周的銷售總額。
注意:Shift()在這里無法使用,因為缺少了數周的數據。
我認為的邏輯:檢查星期數。 在每一行中,然后對w-1,w-2,w-3中的數據求和。
需要的輸出:
A Week Last3WeekSales
0 a 1 0
1 a 2 2
2 a 3 5
3 a 4 12
4 a 5 11
5 a 11 0
6 b 1 0
7 b 2 5
8 b 3 11
9 b 4 20
使用groupby
, shift
和rolling
:
df['Last3WeekSales'] = df.groupby('A')['Sales']\
.apply(lambda x: x.shift(1)
.rolling(3, min_periods=1)
.sum())\
.fillna(0)
輸出:
A Sales Week Last3WeekSales
0 a 2 1 0.0
1 a 3 2 2.0
2 a 7 3 5.0
3 a 1 4 12.0
4 a 4 5 11.0
5 a 3 6 12.0
6 b 5 1 0.0
7 b 6 2 5.0
8 b 9 3 11.0
您可以使用pandas.rolling_sum
對3個最后的值求和,並使用shift(n)
將列移動n次(在您的情況下為1個)。
如果我們假設您的“銷售額”列包含每周的銷售額,則代碼為:
df["Last3WeekSales"] = df.groupby("A")["sales"].apply(lambda x: pd.rolling_sum(x.shoft(1),3))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.