如何为棒球运动员数据新增年代列并绘制Seaborn箱线图
给棒球运动员数据添加年代分组并绘制箱线图的解决方案
嘿,这个需求我熟!给棒球数据按十年分组加标签再画箱线图,其实两步就能搞定,我给你一步步说清楚~
第一步:新增年代分组列
首先假设你的DataFrame里存储年份的列名叫year(如果不是,记得替换成你实际的列名)。我们用矢量化运算来快速生成年代标签,比循环或者apply高效得多,尤其适合你这种时间跨度大的数据集。
代码示例:
import pandas as pd # 假设你的DataFrame名为df,年份列是'year' # 计算每个年份所属的十年起始年 df['decade'] = ((df['year'] - 1) // 10) * 10 + 1 # 把起始年转成"XXXX-XXXX"的字符串格式,方便后续绘图 df['decade_label'] = df['decade'].apply(lambda x: f"{x}-{x+9}")
举个例子:1871减去1是1870,除以10取整得187,乘以10加1就是1871,对应标签1871-1880;1880的话,1880-1=1879,//10还是187,所以也归到1871-1880,完美匹配你要的分组规则。
如果年份列有缺失值,可以先处理:比如用df = df.dropna(subset=['year'])删除缺失年份的行,或者根据实际情况填充。
第二步:绘制箱线图
接下来用Seaborn来画箱线图,它对分组数据的可视化非常友好。如果没装Seaborn,先执行pip install seaborn安装。
代码示例:
import seaborn as sns import matplotlib.pyplot as plt # 设置清爽的绘图风格 sns.set_style("whitegrid") # 绘制箱线图,x是年代标签,y替换成你要分析的平均数据列(比如'avg_hits') plt.figure(figsize=(12, 6)) sns.boxplot(x='decade_label', y='avg_hits', data=df) # 添加标题和轴标签 plt.title('棒球运动员年度平均数据按年代分布箱线图', fontsize=14) plt.xlabel('年代', fontsize=12) plt.ylabel('平均数据', fontsize=12) # 旋转x轴标签,避免重叠 plt.xticks(rotation=45) plt.show()
要是想用Matplotlib原生绘制,也可以这样写:
import matplotlib.pyplot as plt plt.figure(figsize=(12, 6)) df.boxplot(column='avg_hits', by='decade_label', figsize=(12, 6)) plt.title('棒球运动员年度平均数据按年代分布箱线图') plt.suptitle('') # 去掉Matplotlib自动生成的冗余标题 plt.xlabel('年代') plt.ylabel('平均数据') plt.xticks(rotation=45) plt.show()
额外小提示
- 如果绘图时x轴年代顺序乱了,可以把
decade_label转成有序分类:
# 获取所有唯一年代标签并排序 sorted_decades = sorted(df['decade_label'].unique()) df['decade_label'] = pd.Categorical(df['decade_label'], categories=sorted_decades, ordered=True)
这样x轴就会严格按时间顺序排列,不会出现混乱。
- 如果需要按多维度分组(比如同时按年代和球员位置),可以用
sns.boxplot(x='decade_label', y='avg_hits', hue='position', data=df)添加分组颜色区分。
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

