Pandas入门者求助:GroupBy后薪资均值最值计算及KeyError问题
问题排查与解决方法
核心原因
你遇到的KeyError是因为分组后的Series转CSV再转回DataFrame时,列名或索引的格式发生了变化,导致你指定的job_title和salary_in_usd列不存在。
分步排查与修复
1. 先确认当前DataFrame的列名
执行以下代码,查看df_two实际的列名:
print(df_two.columns)
通常会出现两种情况:
- 列名是
['Unnamed: 0', 'salary_in_usd']:说明分组后的Series索引(即job_title)被存成了无列名的第一列 - 只有
salary_in_usd一列:说明保存CSV时没把索引写入,丢失了job_title数据
2. 修复CSV中转的格式问题
如果一定要用CSV中转,调整保存和读取的代码:
# 分组计算均值(假设原始数据为df) salary_mean = df.groupby('job_title')['salary_in_usd'].mean() # 保存CSV时,指定索引列的名称为job_title salary_mean.to_csv('mean_salary.csv', index_label='job_title') # 读取CSV,此时列名就是job_title和salary_in_usd df_two = pd.read_csv('mean_salary.csv') # 现在可以正常取列 test = df_two.loc[:, ['job_title', 'salary_in_usd']]
3. 更高效的方案(无需CSV中转)
其实完全不用绕CSV,直接把分组后的Series转为DataFrame即可,避免格式问题:
# 分组计算均值并直接转为DataFrame df_two = df.groupby('job_title')['salary_in_usd'].mean().reset_index(name='salary_in_usd') # 正常取列 test = df_two.loc[:, ['job_title', 'salary_in_usd']] # 直接找薪资均值的最高/最低值及对应职位 max_mean_row = df_two.loc[df_two['salary_in_usd'].idxmax()] min_mean_row = df_two.loc[df_two['salary_in_usd'].idxmin()] print(f"最高薪资均值职位:{max_mean_row['job_title']},薪资:{max_mean_row['salary_in_usd']}") print(f"最低薪资均值职位:{min_mean_row['job_title']},薪资:{min_mean_row['salary_in_usd']}")
补充说明
分组后得到的Series结构是:索引为job_title,值为薪资均值,列名为salary_in_usd。直接用reset_index()可以把索引转为普通列,同时给均值列指定明确名称,这是最稳妥的方式。
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

