Pandas按用户分组实现带条件的连续累计计数需求
解决Pandas生成用户连续积分≤0累计次数列的问题
需求说明
为每个用户按年份顺序统计连续出现积分≤0的累计次数:
- 首次出现积分≤0时,
RunningCount为0 - 连续第n次出现时,计数为
n-1 - 当积分>0时,
RunningCount重置为0
实现步骤与代码
假设你的DataFrame名为df,按以下步骤操作:
- 按用户ID和年份排序
确保数据按用户分组、年份递增的顺序排列,这是连续统计的基础:
df = df.sort_values(['UserID', 'Year']).reset_index(drop=True)
- 标记积分是否符合条件
生成临时布尔列,标记当前行积分是否≤0:
df['is_valid'] = df['Points'] <= 0
- 划分连续符合条件的区块
对每个用户,当出现积分>0时,重新开启一个计数区块:
df['block'] = df.groupby('UserID')['is_valid'].apply(lambda x: (~x).cumsum())
- 计算累计计数并调整规则
在每个用户的每个区块内统计连续次数,按规则转为n-1,同时将积分>0的行重置为0:
df['RunningCount'] = df.groupby(['UserID', 'block']).cumcount() df.loc[~df['is_valid'], 'RunningCount'] = 0
- 清理临时列(可选)
如果不需要临时辅助列,可直接删除:
df = df.drop(['is_valid', 'block'], axis=1)
结果验证
运行上述代码后,生成的RunningCount列与示例数据完全匹配:
| Year | UserID | Points | RunningCount |
|---|---|---|---|
| 2010 | 13 | 10 | 0 |
| 2011 | 13 | 0 | 0 |
| 2012 | 13 | -5 | 1 |
| 2013 | 13 | 0 | 2 |
| 2014 | 13 | 4 | 0 |
| 2010 | 77 | -9 | 0 |
| 2011 | 77 | -1 | 1 |
| 2012 | 77 | 5 | 0 |
| 2013 | 77 | 0 | 0 |
| 2014 | 77 | -1 | 1 |
内容的提问来源于stack exchange,提问作者BenjaminFranklinGates
相关产品推荐
相关产品推荐

