如何用Python对两列groupby?求更优失业率计算及年龄中位数方法
优化方案:一次性计算城市失业率与年龄中位数
嘿,你的需求其实用Pandas的groupby+聚合函数就能一步到位,比你现在拆分多步的写法简洁高效太多啦!先给你梳理下优化思路:
1. 更优雅的失业率计算
你原来的写法需要分别统计总人数、失业人数再合并计算,其实可以直接在分组后,对每个城市的Job列计算失业占比:
方法一:用apply快速计算
# 计算失业率(百分比) unemployment_rate = df.groupby('City')['Job'].apply( lambda group: (group == 'Unemployed').mean() * 100 ).reset_index(name='UnemploymentRate')
方法二:自定义聚合函数(更易读)
如果觉得lambda不够直观,也可以写个小函数:
def get_unemployment_rate(job_series): total_people = len(job_series) unemployed_count = (job_series == 'Unemployed').sum() return (unemployed_count / total_people) * 100 unemployment_rate = df.groupby('City')['Job'].agg( get_unemployment_rate ).reset_index(name='UnemploymentRate')
这两种写法都能直接得到每个城市的失业率,不需要额外的合并、重置索引操作,代码量少了一大半!
2. 计算每个城市的年龄中位数
这个更简单,直接用Pandas内置的median()聚合函数即可:
age_median = df.groupby('City')['Age'].median().reset_index(name='AgeMedian')
3. 一次性获取两个统计指标(推荐)
如果你想把失业率和年龄中位数放在同一个DataFrame里,用groupby.agg()可以一次性完成多个聚合操作,这是最优雅的写法:
# 一次性计算两个指标 city_stats = df.groupby('City').agg( UnemploymentRate=('Job', lambda x: (x == 'Unemployed').mean() * 100), AgeMedian=('Age', 'median') ).reset_index()
运行后得到的city_stats结果如下:
City UnemploymentRate AgeMedian 0 x 66.666667 27 1 y 33.333333 28
为什么这个方案更好?
- 代码简洁:从原来的10+行代码压缩到3行,逻辑更清晰
- 效率更高:减少了中间DataFrame的创建与合并,避免不必要的数据拷贝
- 可扩展性强:如果之后需要加其他统计指标(比如平均年龄、就业人数),直接在
agg()里加新的键值对就行
内容的提问来源于stack exchange,提问作者emax
相关产品推荐
相关产品推荐

