如何用Pandas和Matplotlib分析绘制运动员年龄与奥运获奖率的相关性
用Pandas和Matplotlib分析运动员年龄与奥运获奖相关性
需求概述
基于包含运动员姓名、年龄、奖牌(金牌/银牌/铜牌/NA)的数据集,完成以下操作:
- 统计各年龄组的运动员总数
- 计算每个年龄组中获得任意奖牌(
Medal字段非空)的运动员占比 - 绘制以年龄为X轴、获奖百分比为Y轴的可视化图表
实现步骤
1. 导入依赖库
先导入所需工具库:
import pandas as pd import matplotlib.pyplot as plt
2. 加载示例数据
可以直接构造示例数据集,也可以从CSV/Excel文件读取:
# 构造示例数据 data = pd.DataFrame({ 'Name': ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6', 'Name7', 'Name8', 'Name9', 'Name10', 'Name11'], 'Age': [20, 21, 20, 22, 22, 21, 20, 19, 20, 20, 21], 'Medal': ['Silver', pd.NA, pd.NA, 'Bronze', pd.NA, pd.NA, 'Gold', 'Silver', 'Gold', pd.NA, 'Silver'] })
3. 数据处理与百分比计算
通过分组统计完成核心计算:
# 新增列标记是否获奖 data['Has_Medal'] = data['Medal'].notnull() # 按年龄分组,统计总人数和获奖人数 age_stats = data.groupby('Age').agg( total_athletes=('Name', 'count'), medal_winners=('Has_Medal', 'sum') ) # 计算获奖百分比(保留整数) age_stats['win_percentage'] = round((age_stats['medal_winners'] / age_stats['total_athletes']) * 100, 0)
运行后得到的统计结果与预期一致:
| Age | total_athletes | medal_winners | win_percentage |
|---|---|---|---|
| 19 | 1 | 1 | 100.0 |
| 20 | 5 | 3 | 60.0 |
| 21 | 3 | 1 | 33.0 |
| 22 | 2 | 1 | 50.0 |
4. 绘制可视化图表
用Matplotlib生成柱状图(可按需替换为折线图):
# 设置图表风格 plt.style.use('seaborn-v0_8') # 创建图表 plt.figure(figsize=(8, 5)) plt.bar(age_stats.index, age_stats['win_percentage'], color='#1f77b4') # 添加标签和标题 plt.xlabel('运动员年龄', fontsize=12) plt.ylabel('获奖百分比 (%)', fontsize=12) plt.title('各年龄组运动员奥运获奖占比', fontsize=14) # 在柱子上标注百分比数值 for x, y in zip(age_stats.index, age_stats['win_percentage']): plt.text(x, y + 1, f'{int(y)}%', ha='center', fontsize=10) # 设置Y轴范围,确保数值标签完全显示 plt.ylim(0, 110) # 显示图表 plt.show()
关键说明
- 用
groupby('Age').agg()可一次性完成多指标统计,效率更高 Medal.notnull()直接判定是否获奖,无需区分奖牌类型- 可视化时添加数值标签能让图表更直观,调整Y轴范围可避免标签被遮挡
内容的提问来源于stack exchange,提问作者Toshik
相关产品推荐
相关产品推荐

