python - Pandas:按组对前 N 行求和
问题描述
我想对每组的前 N 个数据周期求和。我已经看到如何单独执行每个操作(按组求和,或将前 N 个周期求和),但无法找到一种干净的方式来同时完成这两个操作。
我目前正在执行以下操作:
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 列之后删除它们,但鉴于我将创建多个不同数量的滞后期的列,我觉得必须有一个更简单的方法。
解决方案
This is 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
推荐阅读
- android - 为什么 startActivity() 从接收器激活 MDM 提示会闪烁提示而不打开它?
- c++ - endl 是否需要刷新缓冲区?
- html - 如何防止 HTML、CSS 中的 3 个重叠图像?
- javascript - React.Native:平面列表未显示
- css - 在本机反应中,Flexbox中的文本垂直居中对齐
- algorithm - 是否有一种算法可以找到所有具有基数 j 的正整数 <= i 集?
- postgresql - Postgresql 计划不周的查询运行时间过长
- python - 您如何遍历返回“TypeError:'NoneType'类型的参数不可迭代”的列表
- java - 如何比较Java中Excel文件中两行的相等性?
- javascript - Chrome Uncaught TypeError:将循环结构转换为 JSON Firebase