pandas groupby场景下如何实现列反向累计求和,统计分组内后续Score为1的数量
实现方案
你需要对分组内的序列先反转做累计求和,再还原顺序后扣除当前行的Score值,即可得到当前行之后同组Score为1的总数量,代码如下:
# 通用写法,兼容所有pandas版本 data['Sum'] = data.groupby('SubjectID copy')['Score'].apply( lambda x: x[::-1].cumsum()[::-1] - x )
逻辑说明
- 按
SubjectID copy分组后,先把每个分组内的Score序列反转,调用cumsum()做正序累计求和 - 把累计求和的结果再次反转,得到的是当前行+当前行之后所有行的Score总和
- 减去当前行的Score值,就排除了当前行本身的计数,仅统计后续行的Score=1的总数量,完全匹配你给出的示例结果。
如果你的数据集行数较多,可以用transform替代apply提升运行效率:
# 性能优化版,适合万行以上规模的数据集 data['Sum'] = data.groupby('SubjectID copy')['Score'].transform( lambda s: s.iloc[::-1].cumsum().iloc[::-1] ) - data['Score']
内容的提问来源于stack exchange,提问作者Guitarman045</think_never_used_51bce0c785ca2f68081bfa7d91973934># 实现方案
你需要对分组内的序列先反转做累计求和,再还原顺序后扣除当前行的Score值,即可得到当前行之后同组Score为1的总数量,代码如下:
# 通用写法,兼容所有pandas版本 data['Sum'] = data.groupby('SubjectID copy')['Score'].apply( lambda x: x[::-1].cumsum()[::-1] - x )
逻辑说明
- 按
SubjectID copy分组后,先把每个分组内的Score序列反转,调用cumsum()做正序累计求和 - 把累计求和的结果再次反转,得到的是当前行+当前行之后所有行的Score总和
- 减去当前行的Score值,就排除了当前行本身的计数,仅统计后续行的Score=1的总数量,完全匹配你给出的示例结果。
大数据量优化写法
如果你的数据集行数较多,可以用transform替代apply提升运行效率:
# 高版本pandas性能优化版 data['Sum'] = data.groupby('SubjectID copy')['Score'].transform( lambda s: s.iloc[::-1].cumsum().iloc[::-1] ) - data['Score']
内容的提问来源于stack exchange,提问作者Guitarman045
相关产品推荐
相关产品推荐

