Pandas按组从0开始累计计数问题及实现思路
解决Pandas按组从0开始累计计数的问题
嘿,我来帮你搞定这个需求!你想要对DataFrame的group列按组统计每个组内元素出现的次数(从0开始累计),这个需求其实Pandas有专门的函数可以轻松实现,下面一步步来拆解:
问题回顾
你的示例DataFrame:
import pandas as pd df = pd.DataFrame({'group': list('aaabbabc')})
期望给df新增一列n,每个组内的行从0开始依次计数,最终得到:
group n 0 a 0 1 a 1 2 a 2 3 b 0 4 b 1 5 a 3 6 b 2 7 c 0
初始代码的问题
你尝试的df['n'] = df.groupby('group').apply(lambda x: list(range(x.shape[0])))之所以不对,是因为groupby.apply返回的是按组索引的结果(比如索引是['a','b','c']),而原DataFrame的索引是0-7,直接赋值会导致索引不匹配,最终得到的n列会是NaN或者错误的嵌套列表。
推荐高效解法:使用cumcount()
Pandas的groupby.cumcount()方法就是专门为这个场景设计的——它会对每个组内的行从0开始顺序计数,完美匹配你的需求:
df['n'] = df.groupby('group').cumcount()
运行这段代码后,df就会得到你期望的结果。这个方法不仅简洁,而且执行效率远高于自定义lambda的方式。
如果你想修改初始代码(用transform替代apply)
如果一定要基于你的初始思路调整,可以用groupby.transform代替apply,因为transform会把组内的计算结果广播回原DataFrame的每一行,保持索引一致:
df['n'] = df.groupby('group').transform(lambda x: list(range(len(x))))
不过还是更推荐cumcount(),因为它是专门的API,可读性和性能都更好。
验证结果
运行推荐的代码后,打印df就能看到和你期望完全一致的输出啦!
内容的提问来源于stack exchange,提问作者Carter Masterson
相关产品推荐
相关产品推荐

