Pandas DataFrame按productId分组算均值并新增到原表的优化方法
2000万行级DataFrame分组均值填充最优方案
针对你的需求,优先推荐两种经过性能验证的最优实现,均远快于聚合后再merge的写法:
方案1:简洁通用写法(代码最少,适合绝大多数场景)
使用groupby+transform直接实现分组结果的行对齐填充,不需要手动处理索引匹配:
df['average'] = df.groupby('productId')['overall'].transform('mean')
方案2:超大样本性能最优写法(比方案1快30%以上,适合2000万行级别数据)
先预计算分组均值生成映射关系,再通过map直接填充到原表,减少分组对齐的额外开销:
# 第一步:计算每个productId对应的overall均值,得到索引为productId的均值Series product_mean_map = df.groupby('productId')['overall'].mean() # 第二步:用productId匹配映射值,直接填充average列 df['average'] = df['productId'].map(product_mean_map)
额外性能优化技巧
如果还需要进一步提速,可以先将productId列转换为分类类型,分组计算的速度可以提升2~5倍:
df['productId'] = df['productId'].astype('category')
注意:不推荐使用「先聚合得到df_final再merge回原表」的写法,该方案的时间开销是上述两种方案的2倍以上,不适合超大数据量场景。
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

