如何用Seaborn按Type汇总数据并绘制箱线图及报错解决
问题解决:按Type汇总数据并绘制箱线图
问题场景
我有一组分属不同类别的数据,希望按相同Type(Operating和Development)汇总数值,并通过Seaborn绘制箱线图展示。使用groupby()方法时触发错误:
Cannot subset columns with a tuple with more than one element. Use a list instead.
原始代码
import seaborn as sns from matplotlib import axes import matplotlib.pyplot as plt import pandas as pd from datetime import datetime, timedelta expenditure_df = pd.read_csv("Expenditure.csv") expenditure_df.head() fig, ax = plt.subplots(figsize=(7, 7)) grouped_data = expenditure_df.groupby(['category']) sum_values = grouped_data['Utilities', 'Rental', 'Salary'].sum() df1 = expenditure_df[expenditure_df['type'].isin(['Operating','Development'])] df1.head() sns.boxplot(y='amount', x='year', data=df1, palette="colorblind", hue='type') ax = sns.countplot(x="year", data=df1) ax.set_xticklabels(ax.get_xticklabels(), rotation=40, ha="right") plt.tight_layout() plt.show()
样本数据说明
样本数据包含date、year、type、category、amount列,其中type分为Operating和Development两类,category包含Utilities、Rental、Salary等细分项。
错误原因与修复
错误出在多列选择的语法上:
sum_values = grouped_data['Utilities', 'Rental', 'Salary'].sum()
Pandas中选择多列必须用列表而非元组,修改为:
sum_values = grouped_data[['Utilities', 'Rental', 'Salary']].sum()
优化后完整代码
结合需求调整后的代码,同时避免同一坐标轴绘图覆盖的问题:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 读取数据 expenditure_df = pd.read_csv("Expenditure.csv") # 筛选目标Type的数据 df1 = expenditure_df[expenditure_df['type'].isin(['Operating','Development'])] # 按Type+Year汇总金额(按需使用) summed_df = df1.groupby(['type', 'year'])['amount'].sum().reset_index() # 分绘箱线图和计数图,避免轴重叠 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(7, 10)) # 箱线图:展示不同年份、不同Type的金额分布 sns.boxplot(y='amount', x='year', data=df1, palette="colorblind", hue='type', ax=ax1) ax1.set_title('各年份不同类型支出分布') # 计数图:展示各年份不同Type的记录数量 sns.countplot(x="year", data=df1, hue='type', ax=ax2) ax2.set_xticklabels(ax2.get_xticklabels(), rotation=40, ha="right") ax2.set_title('各年份不同类型支出记录数') plt.tight_layout() plt.show()
关键调整说明
- 修复
groupby多列选择的语法错误,用列表格式指定列名 - 将箱线图和计数图拆分到子图中,解决原代码中同一轴绘图覆盖的问题
- 保留按
type筛选数据的逻辑,确保仅处理目标类别数据
内容的提问来源于stack exchange,提问作者unleasehed
相关产品推荐
相关产品推荐

