You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

关键调整说明

  1. 修复groupby多列选择的语法错误,用列表格式指定列名
  2. 将箱线图和计数图拆分到子图中,解决原代码中同一轴绘图覆盖的问题
  3. 保留按type筛选数据的逻辑,确保仅处理目标类别数据

内容的提问来源于stack exchange,提问作者unleasehed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:38:14