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