我希望根据行中的值在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
答案 0 :(得分:0)
使用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
答案 1 :(得分: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))