如何基于Pandas DataFrame按年份分组绘制价格箱线图?
嘿,我懂你遇到的小困扰了——用groupby拿到对象后确实不知道怎么继续画图,但其实完全不用纠结手动处理分组结果,有更简单直接的方法实现按年份绘制price箱线图的需求,给你三个实用方案,按需选择:
方案1:用Pandas原生绘图快速实现
Pandas的boxplot方法本身就支持按指定列分组绘制,根本不需要手动处理groupby对象,一行代码就能搞定核心逻辑:
import pandas as pd import matplotlib.pyplot as plt # 假设你的df已经加载完成 df.boxplot(column='price', by='year') plt.title('Price Distribution by Year') # 自定义图表标题 plt.suptitle('') # 去掉Pandas自动添加的默认顶部标题 plt.xlabel('Year') plt.ylabel('Price') plt.show()
这段代码会自动按year列的不同值分组,为每个年份生成对应的price箱线图,所有图会放在同一个坐标系里,方便直接对比不同年份的价格分布。
方案2:用Seaborn绘制更美观的箱线图
如果想要更美观的样式和更丰富的统计细节,推荐用Seaborn库,代码同样简洁:
import seaborn as sns import matplotlib.pyplot as plt sns.boxplot(data=df, x='year', y='price') plt.title('Price Distribution by Year') plt.xlabel('Year') plt.ylabel('Price') plt.show()
Seaborn会自动处理分组逻辑,生成的图表自带美观的配色和网格,非常适合做数据分析展示。
方案3:手动遍历groupby对象绘制子图(适合分开展示)
如果你希望把每个年份的箱线图单独作为子图展示,那可以手动遍历groupby后的对象,逐个绘制:
import matplotlib.pyplot as plt # 按year列分组 year_groups = df.groupby('year') # 设置子图布局,这里按每行3个图排列 total_groups = len(year_groups) rows = (total_groups + 2) // 3 # 计算需要多少行 fig, axes = plt.subplots(nrows=rows, ncols=3, figsize=(15, 10)) axes = axes.flatten() # 把二维子图数组转为一维,方便遍历 # 逐个年份绘制箱线图 for idx, (year, group_data) in enumerate(year_groups): group_data.boxplot(column='price', ax=axes[idx]) axes[idx].set_title(f'Price Distribution - {year}') axes[idx].set_ylabel('Price') # 隐藏多余的空盘子图 for j in range(idx + 1, len(axes)): axes[j].set_visible(False) plt.tight_layout() # 自动调整子图间距 plt.show()
这个方案适合需要单独展示每个年份价格分布的场景,每个子图对应一个年份,布局清晰。
内容的提问来源于stack exchange,提问作者anon_swe
相关产品推荐
相关产品推荐

