Pandas如何按State分组将Score均值插入新增avg列
Pandas 分组匹配均值新增列高效实现
需求说明
- 为Pandas DataFrame新增名为
avg的列,列值为每行所属State分组对应的Score列平均值 - 替代原有逐个筛选State子集、手动赋值、再拼接的低效实现
最优实现方案
直接使用groupby+transform,一行代码完成分组计算和值匹配,无需拆分拼接数据:
import pandas as pd import numpy as np # 构造测试数据 data = {'State':['CA', 'CA', 'CA', 'CA','CA', 'TX', 'TX', 'TX','TX', 'TX', 'FL', 'FL','FL', 'FL', 'FL', 'AZ','AZ','AZ', 'AZ', 'AZ'], 'Score':[3,3,3,2,1,4,2,2,1,2,1,1,1,1,2,2,5,5,5,5], 'Income':[32112,34214,45575,22106,32612,34216,47515,22906,32112,34511,45525,12106,52112,54214,45015,22986,32112,34214,47518,22175], } df = pd.DataFrame(data) # 直接生成avg列:按State分组计算Score均值,自动匹配到对应行 df['avg'] = df.groupby('State')['Score'].transform('mean') # 导出csv文件 df.to_csv("analysis_output.csv", index=False)
实现原理
transform是Pandas分组对象的专用方法,会在完成分组聚合计算后,将每个分组的聚合结果广播到该分组下的所有行,最终返回长度和原DataFrame完全一致的序列,可直接赋值为新列,全程不会修改原表的行顺序、也不会产生索引错位问题。
已有分组聚合结果的适配方案
如果你已经提前计算好了分组均值序列(比如示例中的mean_score),可以用map方法按State值匹配对应均值,不需要重新计算:
# 预计算分组均值,返回Series的索引为State取值 mean_score = df.groupby('State')['Score'].mean() # 按State列映射匹配对应均值 df['avg'] = df['State'].map(mean_score)
方案对比
groupby+transform写法最简洁,无需生成中间变量,适合单次计算直接赋值的场景map匹配方案适合需要复用预计算分组聚合结果的场景,可减少重复计算- 两种方案的执行效率远高于手动拆分子集再拼接的实现,数据量越大、分组类别越多时性能优势越明显
内容的提问来源于stack exchange,提问作者nasa313
相关产品推荐
相关产品推荐

