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

Pandas按指定后缀列分组绘图问题求助

解决按列名后缀分组绘图的问题,顺便优化你的数据合并逻辑

嘿,咱们先聊聊你现有的代码处理,再一步步解决绘图的需求~

先看你现有处理的小优化点

你的列重命名逻辑是完全可行的,但合并数据框的写法可以更简洁——嵌套merge的可读性差一点,改成链式merge会更清晰:

# 简化合并逻辑,可读性更强
merge_df = salaried_df.merge(selfemployed_df, on='country', how='inner')\
                     .merge(gdp_df, on='country', how='inner')

另外要注意:合并后记得检查country列有没有重复值,避免后续绘图出现混乱,用merge_df['country'].duplicated().any()就能快速验证。

按列名后缀(_S/_GDP/_SE)分组绘图的实现

首先得把目标列筛选出来,再按后缀分组,最后选择合适的绘图方式(这里用matplotlib和pandas内置绘图举例,你也可以用seaborn美化)。

步骤1:筛选目标列

先把包含指定后缀的列挑出来,排除country列:

# 筛选所有带_S/_GDP/_SE的列
target_cols = [col for col in merge_df.columns if any(suffix in col for suffix in ['_S', '_GDP', '_SE'])]

步骤2:按后缀分组列

把列按后缀分成三类,给每组起个易懂的名称,方便后续绘图管理:

# 按后缀分组,给每组起个易懂的名称
column_groups = {
    '工薪阶层占比 (%)': [col for col in target_cols if '_S' in col],
    '自雇人士占比 (%)': [col for col in target_cols if '_SE' in col],
    '人均GDP': [col for col in target_cols if '_GDP' in col]
}

步骤3:分组绘图(示例:每个指标组的国家对比图)

如果想给每个指标组单独绘图,展示不同国家的数值对比,柱状图是个不错的选择:

import matplotlib.pyplot as plt

# 创建子图,每组指标一个子图
fig, axes = plt.subplots(nrows=len(column_groups), figsize=(12, 18))

# 遍历每个分组,绘制图表
for ax, (group_name, cols) in zip(axes, column_groups.items()):
    # 绘制柱状图,x轴是国家,y轴是该组的所有列(比如各年份的数值)
    merge_df.plot(x='country', y=cols, kind='bar', ax=ax)
    ax.set_title(group_name, fontsize=14)
    ax.set_ylabel('数值', fontsize=12)
    # 旋转x轴标签,避免重叠
    ax.tick_params(axis='x', rotation=60, labelsize=10)

# 自动调整子图间距
plt.tight_layout()
plt.show()

另一种场景:按年份分组,对比同一年份的三个指标

如果你的列名格式是2020_S、2020_SE、2020_GDP这种(年份+后缀),可以按年份分组,对比每个年份不同国家的三个指标:

# 提取所有年份(从列名中拆分)
years = sorted({col.split('_')[0] for col in target_cols})

fig, axes = plt.subplots(nrows=len(years), figsize=(12, 18))

for ax, year in zip(axes, years):
    # 找到该年份对应的所有列
    year_cols = [col for col in target_cols if col.startswith(year)]
    merge_df.plot(x='country', y=year_cols, kind='bar', ax=ax)
    ax.set_title(f'{year}年 各指标对比', fontsize=14)
    ax.set_ylabel('数值', fontsize=12)
    ax.tick_params(axis='x', rotation=60, labelsize=10)

plt.tight_layout()
plt.show()

额外提示

  • 如果你的数据是时间序列(按年份变化),把柱状图换成折线图(kind='line')会更直观。
  • 可以用seaborn的catplot或者barplot来做更美观的分组可视化,逻辑和上面一致,只是绘图函数不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:32:13