Pandas读取CSV执行GroupBy行计数时报KeyError: 'Occupation'的问题
问题根因与修复方案
触发KeyError的核心原因
你打印输出的DataFrame列名实际携带首尾单引号:读入CSV时,pandas没有自动将单引号识别为字段包裹符,把单引号算进了列名内容里,此时真实列名是"'Occupation'"、"'data'",你代码里写的不带单引号的Occupation列根本不存在,因此groupby阶段直接抛出KeyError。
另外你之前的代码还有一个逻辑漏洞:df[['data']].groupby(['Occupation'])的写法是先筛出仅包含data列的子表,这个子表本身不包含Occupation列,就算解决了引号问题,这种写法也会触发列找不到的错误。
修复步骤
- 读取CSV时增加
quotechar参数,告诉pandas用单引号作为字段的包裹标识,自动清除列名、字段值前后的多余单引号:
执行完可以打印df = pd.read_csv(filename, quotechar="'")df.columns验证,此时列名就是不带引号的Occupation、data,和代码里写的列名匹配。 - 调整groupby的写法,保证分组列在操作的DataFrame范围内,统计每个Occupation对应的行数可以直接写:
如果习惯用agg写法,也可以直接指定聚合后的列名,避免生成多级结构的复杂列名:# 按Occupation分组,统计每组的行数,结果直接赋值给df_stats即可存储 df_stats = df.groupby('Occupation', as_index=False)['data'].count()df_stats = df.groupby('Occupation').agg(row_count=('data', 'count'))
常见疑问解答
- 如何存储分组统计的计数结果:聚合完成的结果直接通过等号赋值给自定义变量即可,后续可以对这个变量做重命名、导出、筛选等任意操作。
- groupby和agg返回结果的属性:经过
groupby分组、agg聚合后返回的结果是完全独立的对象(如果只统计单列计数且不指定as_index=False,返回带分组索引的Series;指定as_index=False或做多列聚合时返回结构完整的DataFrame),和原始DataFrame没有内存层面的引用关联,修改聚合结果不会反向影响原始表数据。
内容的提问来源于stack exchange,提问作者NealWalters
相关产品推荐
相关产品推荐

