Pandas按指定列统计重复行计数时报KeyError: 'VIP_ID_SOURCE'错误
问题根因
触发KeyError的核心原因有两个:
- 读取CSV时错误设置了
header=None参数。你的测试CSV第一行本身就是标准列头行,设置这个参数后pandas会完全跳过第一行的列名解析逻辑,直接用0、1、2这类数字索引作为列名,此时DataFrame中根本不存在名为VIP_ID_SOURCE的列,自然触发索引报错。 - 原代码的统计逻辑和“重复行计数求和”的预期存在偏差:
duplicated(keep=False).sum()只能输出所有被标记为重复的行总条数,无法灵活匹配不同的重复统计需求。
修复步骤
修正CSV读取参数:移除
header=None设置,让pandas自动将第一行识别为列名。可根据实际统计需求选择对应代码片段:
- 需求1:统计所有和重复值关联的行总条数(也就是同一个VIP_ID_SOURCE不管重复几次,所有相关行都计入总数)
直接调整读取参数后的完整可运行代码:
# -*- coding: utf-8 -*- import pandas as pd # 修正:移除header=None,自动识别第一行作为列名 df = pd.read_csv("test.csv", delimiter='|') # 按VIP_ID_SOURCE标记所有重复关联的行,统计总条数 dups_row_count = df.duplicated(subset=['VIP_ID_SOURCE'], keep=False).sum() print(f"重复关联的总行数:{dups_row_count}")针对你提供的测试样例,运行后会得到结果
2——因为VIP_ID_SOURCE值为F08210020322的记录一共出现2次,全部被标记为重复行。- 需求2:统计重复带来的冗余行总数(也就是同一个VIP_ID_SOURCE出现n次,只把n-1次的重复冗余计入总和,用来衡量需要去重的行数)
对应代码:
# 按目标列分组统计出现次数,筛选出现次数大于1的组,计算重复冗余行数总和 dup_redundancy = df.groupby('VIP_ID_SOURCE').size().loc[lambda s: s>1].apply(lambda x: x-1).sum() print(f"需要去重的冗余行总数:{dup_redundancy}")针对测试样例运行后会得到结果
1,对应F08210020322重复1次的冗余量。- 需求1:统计所有和重复值关联的行总条数(也就是同一个VIP_ID_SOURCE不管重复几次,所有相关行都计入总数)
排错注意事项
- 如果调整参数后仍然报列名不存在的错误,可以加一行
print(df.columns)打印当前DataFrame的实际列名,排查是否存在列名前后带空格、编码不匹配、分隔符识别错误的问题。 - 如果你的CSV本身确实没有列头,需要在
read_csv时通过names参数手动传入列名列表,不能直接引用不存在的列名。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

