如何按列名的部分内容分组绘制Pandas箱线图?
实现按Year分组、Region区分的箱线图
嘿,这个需求其实用Pandas的数据重塑加上Seaborn就能轻松搞定!你已经提前提取的列映射表完全能用得上,不过如果列名格式规整的话,我们也可以直接从列名里拆分信息,两种方案我都给你整理出来:
步骤1:准备数据
先把你的原始数据集和映射表转换成Pandas DataFrame:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 原始宽格式数据集 raw_data = pd.DataFrame({ 'local_term_1year': [30, 20], 'regional_term_1year': [30, 40], 'local_term_2year': [40, 50], 'regional_term_2year': [50, 60] }) # 你已有的列映射表 col_map = pd.DataFrame({ 'column': ['local_term_1year', 'regional_term_1year', 'local_term_2year', 'regional_term_2year'], 'year': ['1year', '1year', '2year', '2year'], 'region': ['local', 'regional', 'local', 'regional'] })
步骤2:将宽表转成长表(两种方法)
箱线图需要长格式数据才能按分组和类别区分,这里有两种方式处理:
方法A:用你已有的映射表合并
如果列名格式不固定,用映射表是更稳妥的方式:
# 把宽表转成长表,保留列名和对应的值 long_data = raw_data.melt(var_name='column', value_name='value') # 合并映射表,给每行数据加上year和region标签 final_data = pd.merge(long_data, col_map, on='column')
方法B:直接从列名拆分信息
如果你的列名格式({region}_term_{year})是固定的,直接拆分列名更高效,不用依赖映射表:
long_data = raw_data.melt(var_name='column', value_name='value') # 按下划线拆分列名,提取region和year long_data[['region', '_', 'year']] = long_data['column'].str.split('_', expand=True) # 删掉没用的中间列 final_data = long_data.drop(['column', '_'], axis=1)
步骤3:绘制分组箱线图
用Seaborn的boxplot,指定x为year分组,y为数值,hue为region(用来区分颜色):
# 设置绘图风格 sns.set_style("whitegrid") # 创建画布 plt.figure(figsize=(8, 6)) # 绘制箱线图 sns.boxplot( data=final_data, x='year', # 按year分组 y='value', # 数值轴 hue='region', # 用region区分箱线颜色 palette='Set2' # 可选:指定配色方案 ) # 添加图表标注 plt.title('Value Distribution by Year Term and Region', fontsize=14) plt.xlabel('Year Term', fontsize=12) plt.ylabel('Value', fontsize=12) plt.legend(title='Region', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
这样生成的图表会有两个分组(1year和2year),每个分组内有两个箱线,分别对应local和regional的数据,完全符合你的需求~
内容的提问来源于stack exchange,提问作者GrandmasLove
相关产品推荐
相关产品推荐

