熊猫:按组求和前N行

时间:2019-09-04 17:48:12

标签: python pandas

我想对每个组的前N个数据周期求和。我已经看到了如何单独进行每个操作(按组求和,或sum prior N periods),但是无法找出一种干净的方法来同时进行这两个操作。

我目前正在执行以下操作:

import pandas as pd

sample_data = {'user': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b'],\
                'clicks': [0,1,2,3,4,5,6,7,8,9]}
df = pd.DataFrame(sample_data)
df['clicks.1'] = df.groupby(['user'])['clicks'].shift(1)
df['clicks.2'] = df.groupby(['user'])['clicks'].shift(2)
df['clicks.3'] = df.groupby(['user'])['clicks'].shift(3)
df['total_clicks_prior3'] = df[['clicks.1','clicks.2', 'clicks.3']].sum(axis=1)

我不想要3个中间滞后列,我只想要这些列的总和,所以我想要的输出是:

>>> df[['clicks','user','total_clicks_prior3']]
   clicks user  total_clicks_prior3
0       0    a                  NaN
1       1    a                  0.0
2       2    a                  1.0
3       3    a                  3.0
4       4    a                  6.0
5       5    b                  NaN
6       6    b                  5.0
7       7    b                 11.0
8       8    b                 18.0
9       9    b                 21.0

注意:创建3列后,显然可以删除它们,但是鉴于我将创建多个具有不同滞后时间的列,因此我觉得必须有一种更简单的方法。

2 个答案:

答案 0 :(得分:3)

这是groupby + rolling + shift

df.groupby('user')['clicks'].rolling(3, min_periods=1).sum().groupby(level=0).shift()

user
a     0     NaN
      1     0.0
      2     1.0
      3     3.0
      4     6.0
b     5     NaN
      6     5.0
      7    11.0
      8    18.0
      9    21.0
Name: clicks, dtype: float64

答案 1 :(得分:1)

如果有适用于每个组的解决方案,则可以使用applygroupby对象上使用它。例如,您链接到一个以df['A'].rolling(min_periods=1, window=11).sum()作为答案的问题。如果这样做符合子组的要求,则可以

df.groupby('user').apply(lambda x: x['clicks'].rolling(min_periods=1, window=11).sum())