pandas 在每一行按月计算 3 个月的累计总和
pandas calculate 3 months cummulative sum on monthly basis at each row
我正在尝试为每个行级别计算过去 3 个月的 cumsum。所以,我的主要数据框看起来像这样
ID
Month
Level_1
1
AUG_15
1
1
SEP_15
0
1
OCT_15
1
1
NOV_15
1
1
DEC_15
0
1
JAN_16
1
1
FEB_16
1
1
MAR_16
1
2
AUG_15
1
2
SEP_15
1
2
OCT_15
1
2
NOV_15
1
2
DEC_15
1
2
JAN_16
1
2
FEB_16
1
2
MAR_16
1
我的最终期望输出是
ID
Month
Level_1
Level_1_m3
1
AUG_15
1
1
1
SEP_15
0
1
1
OCT_15
1
2
1
NOV_15
1
2
1
DEC_15
0
2
1
JAN_16
1
2
1
FEB_16
1
2
1
MAR_16
1
3
2
AUG_15
1
1
2
SEP_15
1
2
2
OCT_15
1
3
2
NOV_15
1
3
2
DEC_15
1
3
2
JAN_16
1
3
2
FEB_16
1
3
2
MAR_16
1
3
所以,基本上 m3 列从特定的最后三个月开始查看并计算 cumsum。
例如对于 ID 1 和月份 Mar_16,cumsum 值为 3,因为它是使用 Mar_16、Feb_16 和 Jan_16.
的值计算得出的
在 pandas 中是否有内置方法可以帮助实现此目的?
所以,确实有人发布了一个答案(后来被删除了)我应该探索 pandas 滚动方法并且它完成了工作。
这是我目前的解决方案:-
df.groupby('ID')['Level_1'].rolling(3, min_periods=1).sum()
如果您的数据已经排序,另一种方法是使用 shift
df["Level_1_m3"]=df["Level_1"]+df["Level_1"].shift(1).fillna(0)+df["Level_1"].shift(2).fillna(0)
我正在尝试为每个行级别计算过去 3 个月的 cumsum。所以,我的主要数据框看起来像这样
ID | Month | Level_1 |
---|---|---|
1 | AUG_15 | 1 |
1 | SEP_15 | 0 |
1 | OCT_15 | 1 |
1 | NOV_15 | 1 |
1 | DEC_15 | 0 |
1 | JAN_16 | 1 |
1 | FEB_16 | 1 |
1 | MAR_16 | 1 |
2 | AUG_15 | 1 |
2 | SEP_15 | 1 |
2 | OCT_15 | 1 |
2 | NOV_15 | 1 |
2 | DEC_15 | 1 |
2 | JAN_16 | 1 |
2 | FEB_16 | 1 |
2 | MAR_16 | 1 |
我的最终期望输出是
ID | Month | Level_1 | Level_1_m3 |
---|---|---|---|
1 | AUG_15 | 1 | 1 |
1 | SEP_15 | 0 | 1 |
1 | OCT_15 | 1 | 2 |
1 | NOV_15 | 1 | 2 |
1 | DEC_15 | 0 | 2 |
1 | JAN_16 | 1 | 2 |
1 | FEB_16 | 1 | 2 |
1 | MAR_16 | 1 | 3 |
2 | AUG_15 | 1 | 1 |
2 | SEP_15 | 1 | 2 |
2 | OCT_15 | 1 | 3 |
2 | NOV_15 | 1 | 3 |
2 | DEC_15 | 1 | 3 |
2 | JAN_16 | 1 | 3 |
2 | FEB_16 | 1 | 3 |
2 | MAR_16 | 1 | 3 |
所以,基本上 m3 列从特定的最后三个月开始查看并计算 cumsum。 例如对于 ID 1 和月份 Mar_16,cumsum 值为 3,因为它是使用 Mar_16、Feb_16 和 Jan_16.
的值计算得出的在 pandas 中是否有内置方法可以帮助实现此目的?
所以,确实有人发布了一个答案(后来被删除了)我应该探索 pandas 滚动方法并且它完成了工作。
这是我目前的解决方案:-
df.groupby('ID')['Level_1'].rolling(3, min_periods=1).sum()
如果您的数据已经排序,另一种方法是使用 shift
df["Level_1_m3"]=df["Level_1"]+df["Level_1"].shift(1).fillna(0)+df["Level_1"].shift(2).fillna(0)