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

Python Pandas中堆叠柱状图无法正常生成的技术问询

解决pd.melt处理后堆叠柱状图不符合预期的问题

我懂你遇到的麻烦了——用pd.melt融合数据、以name和year作为ID透视后,想画堆叠柱状图却达不到预期效果,特别是还有同名同年份的变量要处理对吧?咱们一步步来排查和解决。

先捋清楚核心问题

堆叠柱状图的核心要求是长格式数据:需要明确的「类别列」(比如年份/名称)、「堆叠分组列」(就是你说的“预计怀孕数量...”这类不同维度)、「数值列」。大概率是你用pd.melt后的结构没对齐这个要求,或者没处理好同名同年的重复数据。

分步解决示例

1. 先模拟你的原始数据场景

假设你的原始数据大概是这样(包含同名同年的多条数据):

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 模拟数据:存在同名同年的多条记录,以及多个预计怀孕数量的维度列
df = pd.DataFrame({
    'name': ['A', 'A', 'A', 'B', 'B'],
    'year': [2022, 2022, 2023, 2022, 2023],
    '预计怀孕数量_城市': [10, 5, 15, 8, 12],
    '预计怀孕数量_农村': [3, 2, 4, 2, 3],
    '预计怀孕数量_城镇': [5, 3, 7, 4, 6]
})

2. 正确执行pd.melt转换

要精准提取所有“预计怀孕数量”相关的列作为堆叠分组,同时保留name和year作为ID:

# 用列表推导式筛选目标列,避免把无关列混入
melted_df = pd.melt(
    df,
    id_vars=['name', 'year'],
    value_vars=[col for col in df.columns if '预计怀孕数量' in col],
    var_name='统计维度',  # 给堆叠的分组列起个清晰的名字
    value_name='数量'
)

转换后的数据是标准长格式,结构大概是这样:

name  year        统计维度  数量
0    A  2022  预计怀孕数量_城市  10
1    A  2022  预计怀孕数量_城市   5
2    A  2023  预计怀孕数量_城市  15
3    B  2022  预计怀孕数量_城市   8
4    B  2023  预计怀孕数量_城市  12
...

3. 处理同名同年的重复数据

因为存在同名同年的多条记录,必须先聚合数值,否则堆叠高度会重复计算:

# 按name、year、统计维度分组求和,合并重复数据
aggregated_df = melted_df.groupby(['name', 'year', '统计维度'])['数量'].sum().unstack('统计维度')

4. 生成符合需求的堆叠柱状图

直接用pandas的绘图接口,指定stacked=True即可:

aggregated_df.plot(kind='bar', stacked=True, figsize=(10, 6))

# 美化图表
plt.xlabel('名称-年份')
plt.ylabel('总数量')
plt.title('不同维度下预计怀孕数量堆叠柱状图')
plt.legend(title='统计维度', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()

常见误区排查

  • melt参数错误:如果没指定value_vars,会把所有非ID列都转成堆叠分组,混入无关数据;
  • 未聚合重复数据:同名同年的多条记录会导致数值重复,堆叠高度失真,一定要用groupby做聚合;
  • 数据格式不对:堆叠图需要长格式(或聚合后的宽格式),如果你的透视结果是混乱的宽格式,绘图时无法识别堆叠维度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:51