如何用for循环创建列?为DataFrame生成ID重复次数对应列
问题:为DataFrame添加ID重复次数列,基于groupby实现
我已经用for循环统计了DataFrame中ID的重复次数,现在需要新增一列记录每个对应ID的重复总数——也就是给df['ID']添加一列,显示该ID的出现次数,同时想了解如何用groupby命令实现这个需求。
我的现有代码:
test = df['ID'].sort_values(ascending=True) rep = 0 for k in range(0,len(test)-1): if(test[k]==test[k+1]): rep += 1 if(k==len(test)-2): print(test[k],',', rep+1) else: print(test[k],',', rep+1) rep = 0
输出结果:
7614381 , 1 349444 , 5 4577800 ,7
解决方案
你不需要用循环实现这个需求,pandas提供了更高效的内置方法,以下两种方式都能快速完成:
方法1:使用value_counts映射
这是最简洁的方式,先统计每个ID的出现次数,再映射到新列:
df['重复次数'] = df['ID'].map(df['ID'].value_counts())
df['ID'].value_counts()会返回一个以ID为索引、出现次数为值的Series,map方法会自动将每行的ID对应到对应的次数,填充到新列中。
方法2:使用groupby + transform
如果你想基于groupby实现,用transform可以将分组统计的结果广播到原DataFrame的每一行:
df['重复次数'] = df.groupby('ID')['ID'].transform('count')
groupby('ID'):按ID对DataFrame分组transform('count'):计算每组的行数(即该ID的出现次数),并将结果扩展到原DataFrame的对应行,保证每行都能获取到所属ID的总次数。
为什么不用循环?
循环的方式在数据量较大时会非常慢,而上述两种方法都是pandas的向量化操作,底层用C实现,性能远高于Python循环,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者Luan Brito
相关产品推荐
相关产品推荐

