如何无for循环实现Pandas DataFrame按id分组的子集累计和?
解决方案
直接借助Pandas的分组、累计求和与位移操作即可实现,无需循环:
步骤1:构建DataFrame
先将给定的字典转换为Pandas DataFrame对象:
import pandas as pd df = pd.DataFrame({ 'id': [1, 1, 1, 0, 0, 4, 5, 5], 'a': [2.5, 3.5, 1.0, 1.0, 2.0, 4.0, 2.3, 4.4] })
步骤2:生成目标列b
通过groupby按id分组,对a列计算累计和后,用shift(1)将每组的累计结果向下偏移一行,最后用fillna(0)填充每组开头的空值:
df['b'] = df.groupby('id')['a'].cumsum().shift(1).fillna(0)
验证结果
执行后得到的DataFrame与示例要求完全一致:
id a b 0 1 2.5 0.0 1 1 3.5 2.5 2 1 1.0 6.0 3 0 1.0 0.0 4 0 2.0 1.0 5 4 4.0 0.0 6 5 2.3 0.0 7 5 4.4 2.3
这种方法依赖Pandas的矢量化运算,效率远高于循环,且适配你提到的“同一id的行始终相邻”的前提条件。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

