如何快速统计Pandas DataFrame中各重复行的出现次数?
高效统计Pandas DataFrame重复行次数的方案
你当前用的循环方法效率极低,150万行数据下会慢到离谱——每一次循环都要对全表做布尔索引扫描,时间复杂度是O(n*m),完全没必要。下面是两个最快的解决方案:
方案1:给原DataFrame所有行添加重复次数列
如果需要保留原DataFrame的所有行,同时给每行加上自己的重复次数,用groupby+transform的向量化操作,这是最快的方式:
# 给每行添加对应的重复次数列 dupDF['count'] = dupDF.groupby(['variable1', 'variable2'])['variable1'].transform('count')
transform会把每个分组的计数结果广播到组内的每一行,全程是Pandas内部优化的C级操作,百万级数据秒出结果。
方案2:只保留唯一行并添加计数列
如果只需要去重后的唯一行,加上对应的重复次数,用下面两种方法二选一:
方法A:用value_counts
# 直接统计唯一行的重复次数,转成DataFrame uniqDF = dupDF.value_counts(subset=['variable1', 'variable2']).reset_index(name='count')
方法B:用groupby聚合
# 分组后统计每组大小,重命名计数列 uniqDF = dupDF.groupby(['variable1', 'variable2'], as_index=False).size().rename(columns={'size': 'count'})
这两种方法都是向量化操作,比你的循环方法快几个数量级。
另外你之前用pivot_table出错,是因为这个函数是用来做透视表的,核心逻辑是按行/列维度聚合,和“统计整行重复次数”的需求不匹配,所以会出现列缺失,完全没必要用它。
内容的提问来源于stack exchange,提问作者Ronny McNamara
相关产品推荐
相关产品推荐

