如何从含列表列的DataFrame创建带hue的Seaborn分组箱线图
解决方法:处理列表列并绘制分组箱线图
要实现需求,核心是先把DataFrame中存储列表的list1列展开为长格式数据——Seaborn的箱线图需要每个数值对应单独一行的结构,无法直接处理列表类型的列。具体步骤如下:
1. 数据预处理
先将索引转为单独列,再把list1列的列表拆分成多行:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 生成原始DataFrame df = pd.DataFrame({'info':['1a','1b','1a','1b','1a','1b'],'list1': np.random.randint(0, 10, (6,15)).tolist()},index=list('AABBCC')) # 重置索引为单独列,并展开list1的列表元素 df_expanded = df.reset_index(names='group') # 把原索引命名为group列 df_expanded = df_expanded.explode('list1', ignore_index=True) # 将列表拆分为多行 df_expanded['list1'] = df_expanded['list1'].astype(int) # 确保数值类型正确
2. 绘制箱线图
使用Seaborn的boxplot或boxenplot,指定x为原索引分组(A/B/C),y为展开后的数值,hue为info列,同时设置图表尺寸:
# 设置图表尺寸,替换X/Y为你需要的数值 plt.figure(figsize=(10, 6)) # 绘制箱线图,dodge=True让同组的两个箱线图相邻不重叠 sns.boxplot(data=df_expanded, x='group', y='list1', hue='info', dodge=True) # 自定义图表标签 plt.title('分组箱线图(按原索引A/B/C分组)') plt.xlabel('分组(原索引)') plt.ylabel('list1数值') # 显示图例和图表 plt.legend(title='info') plt.show()
关键说明
explode('list1'):把每个列表中的元素拆成单独一行,同时保留对应的group和info标签,让Seaborn能正确对每个分组下的不同info类别做统计。- 若要使用
boxenplot,直接把sns.boxplot替换为sns.boxenplot即可,参数完全一致。
内容的提问来源于stack exchange,提问作者swifty
相关产品推荐
相关产品推荐

