使用Seaborn汇总数据绘箱线图遇ValueError,请求排查问题
问题排查与修正
错误原因
触发ValueError: Cannot subset columns with a tuple with more than one element. Use a list instead的直接原因是你注释掉的groupby代码中,多列选择用了元组而非列表:
# 错误写法(元组) sum_values = grouped_data['Utilities', 'Rental', 'Salary'].sum() # 正确写法(列表) sum_values = grouped_data[['Utilities', 'Rental', 'Salary']].sum()
不过这段代码已被注释,当前运行的代码未执行它,但你的核心需求(汇总同一type下各category的总金额后绘制箱线图)也未实现——当前代码直接用原始的单条记录amount值绘图,不符合你要展示每年Operating/Development总金额分布的预期。
修正步骤
- 按
type和financial_year分组,汇总每组的amount总和,得到每年各类型的总费用数据; - 基于汇总后的数据绘制箱线图,移除重复的绘图逻辑(当前代码同时调用
sns.boxplot和sns.countplot会覆盖绘图区域)。
完整修正代码
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 读取数据 expense_df = pd.read_csv("Expenses.csv") # 按type和financial_year分组,汇总amount总和 summary_df = expense_df.groupby(['type', 'financial_year'], as_index=False)['amount'].sum() # 筛选目标类型 summary_df = summary_df[summary_df['type'].isin(['Operating','Development'])] # 绘制箱线图 fig, ax = plt.subplots(figsize=(7, 7)) sns.boxplot( y='amount', x='financial_year', hue='type', data=summary_df, palette="colorblind", ax=ax ) # 设置x轴标签旋转 ax.set_xticklabels(ax.get_xticklabels(), rotation=40, ha="right") plt.tight_layout() plt.show()
说明
- 分组汇总时用
as_index=False保证结果为DataFrame格式,方便后续绘图; - 代码自动聚合了同一type+年份下所有category的金额,符合你汇总后绘制箱线图的需求;
- 移除了多余的countplot,仅保留箱线图实现预期展示效果。
内容的提问来源于stack exchange,提问作者unleasehed
相关产品推荐
相关产品推荐

