如何在分组后的Pandas DataFrame中比较两列并找出不匹配字段
解决分组后Pandas DataFrame列比较的KeyError问题并获取不匹配字段
问题原因
出现KeyError: "None of [Index(['A', '1234'])] are in the [columns]"是因为你在分组后的处理逻辑中错误引用了不存在的列名('A'和'1234'),应该使用实际的列名predicted_value和actual_value进行比较。
正确实现步骤
1. 构造示例数据(可替换为你的真实数据)
import pandas as pd data = { 'file_name': ['doc1', 'doc1', 'doc1', 'doc2', 'doc2'], 'page_no': [1, 1, 2, 1, 1], 'field_name': ['a', 'b', 'a', 'c', 'd'], 'predicted_value': ['123', '456', '123', '789', '012'], 'actual_value': ['123', '4567', '123', '789', '012'] } df = pd.DataFrame(data)
2. 方法一:直接筛选不匹配字段(适合单唯一字段场景)
如果每个(file_name, page_no, field_name)组合是唯一的,可直接筛选不匹配行后提取字段:
# 筛选预测值与实际值不相等的行 mismatched_rows = df[df['predicted_value'] != df['actual_value']] # 获取去重后的不匹配字段列表 mismatched_fields = mismatched_rows['field_name'].unique().tolist() print(mismatched_fields) # 输出: ['b']
3. 方法二:分组后逐组处理(适合需保留分组维度的场景)
如果需要按file_name和page_no分组,单独查看每个组的不匹配字段,可使用groupby.apply:
def get_group_mismatches(group): # 提取当前组内不匹配的字段名 return group[group['predicted_value'] != group['actual_value']]['field_name'].tolist() # 分组并获取每个组的不匹配字段 grouped_result = df.groupby(['file_name', 'page_no']).apply(get_group_mismatches) # 若需要全局所有不匹配字段(去重) global_mismatched_fields = list(set(field for fields in grouped_result for field in fields)) print(grouped_result) # 输出: # file_name page_no # doc1 1 [b] # 2 [] # doc2 1 [] # dtype: object print(global_mismatched_fields) # 输出: ['b']
关键注意事项
- 确保比较时使用的列名与DataFrame实际列名完全一致(区分大小写)
- 若字段值包含空值,可使用
df['predicted_value'].ne(df['actual_value'], na=False)来忽略空值干扰 - 若不需要去重,去掉
unique()或set()即可保留所有重复的不匹配字段记录
内容的提问来源于stack exchange,提问作者Cosmo
相关产品推荐
相关产品推荐

