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

Python遍历DataFrame列绘制分组柱状图触发TypeError报错求解

报错原因

触发类型错误的核心是筛选逻辑书写错误:df.columns > 80 是将**列名(全为字符串类型,比如Name/Test1)**和整数80做大小比较,字符串和整数无法直接比较,因此抛出类型错误。
原代码还存在几个会影响运行的问题:

  • 循环内用data作为聚合后数据集的变量名,覆盖了最开始定义的原始数据变量,第一次循环结束后原始数据就会被替换,后续迭代直接报错
  • 用df.columns[1:]取数列的写法鲁棒性差,一旦列顺序调整就会取错列
  • 没有给每个子图设置对应标识,多图生成后无法区分对应哪个分数字段
修复后代码

代码自动适配任意数量的数值列,不需要因为字段数增加修改逻辑:

import pandas as pd
import matplotlib.pyplot as plt

raw_data = {'Name': ['Tom', 'Joseph', 'Krish', 'John', 'Tom', 'Joseph', 'Krish', 'John'],
            'Test1': [20, 21, 19, 18, 30, 33, 12, 10],
            'Test2': [78, 89, 77, 91, 95, 90, 87, 70]}
df = pd.DataFrame(raw_data)

# 自动排除Name列,遍历所有剩余数值列
for col in df.columns.drop('Name'):
    # 按姓名分组对当前列求和
    agg_result = df.groupby('Name', as_index=True)[col].sum()
    # 为当前列生成独立柱状图
    fig, ax = plt.subplots(figsize=(24,7))
    agg_result.plot(kind='bar', stacked=False, ax=ax)
    # 配置图标识
    ax.set_title(f'{col} 分数分组汇总')
    ax.set_ylabel('分数总和')

plt.show()
补充说明
  • 如果需要增加「筛选分数大于80的记录再统计」的逻辑,正确的行筛选写法为df[df[col] > 80].groupby('Name', as_index=True)[col].sum(),不要对df.columns(列名集合)做数值比较。
  • 用df.columns.drop('Name')定位数值列的写法不受列顺序变动影响,哪怕后续数值列增加到几十个,也可以直接运行不需要调整代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:01:10