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

如何在分组后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:40:27