You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python Series索引转换为MultiIndex并绘制均值柱状图

解决单级索引Series转多级索引并绘制带数值标签的柱状图

Got it, let's break down how to convert your single-index survival mean Series into a MultiIndex one, then plot it with the mean values clearly displayed (either on top of bars or aligned with the Y-axis—super helpful for readability!).

第一步:将单级索引Series转为多级索引

First, let's start with your original mean Series:

import pandas as pd

# 你的原均值Series
age_survival_mean = raw_data.groupby('Age_group')['Survived'].mean()

To turn this into a MultiIndex Series, we can add a second index level (like a label for the metric, e.g., "Survival_Mean") to align with your existing size-based MultiIndex Series. Here are two simple, practical methods:

方法1:用reset_index + set_index分步转换

# 先把单级索引转为普通列
multi_mean = age_survival_mean.reset_index()
# 添加一个统一的二级索引列,标记这是生存率均值
multi_mean['Metric'] = 'Survival_Mean'
# 重新设置为多级索引
multi_mean = multi_mean.set_index(['Age_group', 'Metric'])['Survived']

方法2:直接构造MultiIndex的简洁写法

If you prefer a one-liner:

multi_mean = age_survival_mean.reindex(
    pd.MultiIndex.from_product(
        [age_survival_mean.index, ['Survival_Mean']],
        names=['Age_group', 'Metric']
    )
)

Now multi_mean is a MultiIndex Series with Age_group as the first level and Metric as the second—perfect for keeping your data structure consistent with the size-based Series you already have.

第二步:绘制柱状图并显示均值数值

Now that we have the MultiIndex Series, let's plot it. If you want the mean values to be visible on the plot (which I assume is what you mean by "Y轴能显示均值数值"), here's how to do it with matplotlib:

方式1:单独绘制均值柱状图(带数值标签)

import matplotlib.pyplot as plt

# 绘制柱状图
ax = multi_mean.unstack().plot(kind='bar', figsize=(10, 6), title='Survival Rate by Age Group')

# 给每个柱子顶部添加数值标签
for p in ax.patches:
    ax.annotate(f'{p.get_height():.2f}',
                (p.get_x() + p.get_width() / 2., p.get_height()),
                ha='center', va='center',
                xytext=(0, 9),
                textcoords='offset points')

plt.ylabel('Survival Rate')
plt.xlabel('Age Group')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

方式2:和生存计数数据对比绘制(可选)

If you want to plot both the survival counts (from your unstacked size Series) and the mean rate together, you can use a twin Y-axis:

# 你已有的生存计数Series(unstack后)
age_survival_size = raw_data.groupby(['Age_group', 'Survived']).size().unstack()

fig, ax1 = plt.subplots(figsize=(10, 6))

# 绘制生存计数柱状图
age_survival_size.plot(kind='bar', ax=ax1, color=['#ff9999','#66b3ff'], label=['Not Survived', 'Survived'])
ax1.set_ylabel('Number of Passengers')
ax1.set_xlabel('Age Group')
ax1.set_title('Survival Count and Rate by Age Group')
ax1.legend(loc='upper left')

# 添加双Y轴绘制生存率均值
ax2 = ax1.twinx()
ax2.plot(ax1.get_xticks(), age_survival_mean.values, color='green', marker='o', label='Survival Rate')
ax2.set_ylabel('Survival Rate')
ax2.legend(loc='upper right')

# 给均值点添加数值标签
for x, y in enumerate(age_survival_mean.values):
    ax2.annotate(f'{y:.2f}', (x, y), ha='center', va='bottom')

plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

关键说明

  • 转成多级索引不是显示均值数值的必须步骤,但它能让你的数据结构和已有的计数Series保持一致,让代码更整洁有序。
  • 核心是通过annotate函数把均值数值标注在图上,这才是实现"Y轴显示均值数值"的关键操作。

内容的提问来源于stack exchange,提问作者JH_EARTH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:04:38