如何基于含列表值的DataFrame绘制箱线图并聚合同索引数据
解决方案
步骤1:预处理数据
首先要把相同index对应的distribution列表合并,再转换成适合绘图的长格式:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 你的原始数据 data = [ [12, [0.1, 0.2, 0.3, 0.4, 0.5]], [14, [0.8, 0.7, 0.6, 0.4, 0.2]], [12, [0.05, 0.25, 0.35]] # 模拟相同index的额外数据 ] df = pd.DataFrame(data, columns=['index', 'distribution']) # 合并相同index的所有distribution列表 merged_df = df.groupby('index')['distribution'].apply( lambda groups: [num for sublist in groups for num in sublist] ).reset_index() # 将列表拆分为每行一个数值的长格式(绘图需要) plot_df = merged_df.explode('distribution', ignore_index=True) plot_df['distribution'] = plot_df['distribution'].astype(float) # 确保数值类型正确
步骤2:绘制箱线图
用seaborn的箱线图函数,直接按index分组展示分布:
plt.figure(figsize=(8, 6)) sns.boxplot(x='index', y='distribution', data=plot_df) # 添加标题和标签 plt.title('各Index对应的Distribution分布箱线图') plt.xlabel('Index') plt.ylabel('Distribution数值') plt.show()
说明
- 分组合并阶段:通过
groupby把相同index的行聚合,再用lambda函数把所有子列表拼接成一个大列表,保证同一index的所有数据都被整合。 - 拆分行阶段:
explode方法把列表中的每个元素单独拆成一行,这样绘图库能识别每个数值对应的分组。 - 箱线图会自动展示每个index分组的中位数、四分位数、须线范围,以及超出须线的异常值,完全匹配需求。
内容的提问来源于stack exchange,提问作者Ribtoks
相关产品推荐
相关产品推荐

