如何使用Python可视化具有层级结构的Pandas DataFrame
解决方案
问题原因
你通过groupby搭配多聚合函数生成的res是带多层列索引的DataFrame,列分为两层:第一层为科目(math/reading/writing),第二层为统计量(mean/var),绘图库无法直接识别这种层级结构,需要先对数据做结构转换。
步骤1:转换数据结构
推荐转为长表格式,和你需要的分组对比类图表适配性更高:
# 先重置索引,把分组键lunch从索引转为普通列,再用melt将宽表转为长表 res_long = res.reset_index().melt( id_vars="lunch", var_name=["subject", "stat"], value_name="score" ) # 过滤出均值统计结果(示例图展示的是不同分组的均值对比) res_mean = res_long[res_long["stat"] == "mean"]
步骤2:绘制目标图表
以seaborn为例,绘制对应样式的分组柱状图:
import seaborn as sns import matplotlib.pyplot as plt sns.barplot(data=res_mean, x="subject", y="score", hue="lunch") plt.xlabel("科目") plt.ylabel("平均分数") plt.title("不同午餐类型学生的各科平均分数对比") plt.show()
可选快速方案:拍平列索引
如果不需要复杂的绘图逻辑,也可以直接将多层列索引合并为单层:
# 合并两层列名为单个字符串,格式为「科目_统计量」 res.columns = [f"{col[0]}_{col[1]}" for col in res.columns] # 直接调用plot方法绘图 res.plot(kind="bar", y=["math_mean", "reading_mean", "writing_mean"]) plt.show()
内容的提问来源于stack exchange,提问作者AlexZaray
相关产品推荐
相关产品推荐

