Python 通过不处理第一个组条目的数据帧,移动组的滚动和

Python 通过不处理第一个组条目的数据帧,移动组的滚动和,python,pandas,dataframe,Python,Pandas,Dataframe,我在尝试向数据帧添加一个字段时遇到了一个问题,该字段对过去三个月(即不包括本月)进行求和 我有一个数据框,显示与频道id相关的每月费用: 对于每个频道id,我想合计过去3个月的费用。每个通道id(例如行索引4、5、6)的前三个月应为0,因为之前没有三个月的总和 为了实现这一点,我正在使用: df.groupby['channel\u id'].rolling3[fee].sum.shift1.sort\u indexlevel=1.fillna0 这基本上是可行的,但对于某些通道ID的第一个实例

我在尝试向数据帧添加一个字段时遇到了一个问题,该字段对过去三个月(即不包括本月)进行求和

我有一个数据框,显示与频道id相关的每月费用:

对于每个频道id,我想合计过去3个月的费用。每个通道id(例如行索引4、5、6)的前三个月应为0,因为之前没有三个月的总和

为了实现这一点,我正在使用:

df.groupby['channel\u id'].rolling3[fee].sum.shift1.sort\u indexlevel=1.fillna0

这基本上是可行的,但对于某些通道ID的第一个实例,它填充了一个我无法绑定到任何东西的值…:

+---------+------------+----------+----------+----------+
|  date   | channel_id |   fee    | NEW_COL  | Correct? |
+---------+------------+----------+----------+----------+
| 2018-03 |         22 | 24525.88 | 52572.85 | YES      |
| 2018-04 |         22 |    10493 | 60211.76 | YES      |
| 2018-05 |         22 |    12500 | 53933.88 | YES      |
| 2017-10 |         43 |     1000 |     2400 | NO!!!    |
| 2017-11 |         43 |     1000 |        0 | YES      |
| 2017-12 |         43 |     1000 |        0 | YES      |
| 2018-01 |         43 |     1000 |     3000 | YES      |
| 2018-02 |         43 |     1000 |     3000 | YES      |
| 2018-03 |         43 |     1000 |     3000 | YES      |
| 2018-04 |         43 |     1000 |     3000 | YES      |
| 2018-05 |         43 |     1000 |     3000 | YES      |
| 2017-10 |         58 |     1750 |        0 | YES      |
| 2017-11 |         58 |     1750 |        0 | YES      |
| 2017-12 |         58 |   3302.1 |        0 | YES      |
+---------+------------+----------+----------+----------+
我对df操作的理解有点粗略,但我对链的理解是:

groupby['channel\u id']:按channel\u id对数据进行分组

.rolling3[fee].sum:将3个月的滚动总和应用于groupby dfs

.shift1:将值上移1,因为我们不需要当前月份

.sort_indexlevel=1:不确定它在上下文中的确切作用,但它是必需的

.fillna0:在前3个月不可用的情况下,用0填充NAN

我已经使用了不同的排序索引值和移位,但我无法理解这是如何计算出不正确的值的。

我认为需要:

或者可能滚动4:

我认为需要:

或者可能滚动4:

适用于

适用于


注意:当groupby之后有多个函数需要应用时,您需要使用apply或两个groupby执行注意:当groupby之后有多个函数需要应用时,您需要使用apply或两个groupby执行
+---------+------------+----------+----------+----------+
|  date   | channel_id |   fee    | NEW_COL  | Correct? |
+---------+------------+----------+----------+----------+
| 2018-03 |         22 | 24525.88 | 52572.85 | YES      |
| 2018-04 |         22 |    10493 | 60211.76 | YES      |
| 2018-05 |         22 |    12500 | 53933.88 | YES      |
| 2017-10 |         43 |     1000 |     2400 | NO!!!    |
| 2017-11 |         43 |     1000 |        0 | YES      |
| 2017-12 |         43 |     1000 |        0 | YES      |
| 2018-01 |         43 |     1000 |     3000 | YES      |
| 2018-02 |         43 |     1000 |     3000 | YES      |
| 2018-03 |         43 |     1000 |     3000 | YES      |
| 2018-04 |         43 |     1000 |     3000 | YES      |
| 2018-05 |         43 |     1000 |     3000 | YES      |
| 2017-10 |         58 |     1750 |        0 | YES      |
| 2017-11 |         58 |     1750 |        0 | YES      |
| 2017-12 |         58 |   3302.1 |        0 | YES      |
+---------+------------+----------+----------+----------+
df['new'] = (df.groupby(['channel_id']).rolling(3)['fee'].sum()
              .groupby(level=0)
              .shift(1)
              .sort_index(level=1)
              .fillna(0)
              .reset_index(level=0, drop=True))
print (df)
          date  channel_id       fee  NEW COLUMN     new
index                                                   
10     2018-03          22  24525.88         NaN     0.0
11     2018-04          22  10493.00         NaN     0.0
12     2018-05          22  12500.00         NaN     0.0
13     2017-10          43   1000.00         0.0     0.0
14     2017-11          43   1000.00         0.0     0.0
15     2017-12          43   1000.00         0.0     0.0
16     2018-01          43   1000.00      3000.0  3000.0
17     2018-02          43   1000.00      3000.0  3000.0
18     2018-03          43   1000.00      3000.0  3000.0
19     2018-04          43   1000.00      3000.0  3000.0
20     2018-05          43   1000.00      3000.0  3000.0
21     2017-10          58   1750.00         0.0     0.0
22     2017-11          58   1750.00         0.0     0.0
23     2017-12          58   3302.10         0.0     0.0
df['new'] = (df.groupby(['channel_id']).rolling(4)['fee'].sum()
              .sort_index(level=1)
              .fillna(0)
              .reset_index(level=0, drop=True))
df.groupby(['channel_id'])['fee'].apply(lambda x :x.rolling(3).sum().shift(1).fillna(0))
Out[319]: 
0        0.0
1        0.0
2        0.0
3        0.0
4        0.0
5        0.0
6     3000.0
7     3000.0
8     3000.0
9     3000.0
10    3000.0
11       0.0
12       0.0
13       0.0
Name: fee, dtype: float64