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
相关产品推荐
相关产品推荐

