行中的条件总和到pandas中的新列

时间:2018-05-22 14:58:09

标签: python pandas aggregate rolling-sum

我希望根据行中的值在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 

2 个答案:

答案 0 :(得分:0)

使用groupbyshiftrolling

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))