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

Python:在含#分隔值的列中匹配另一列值时出现KeyError

问题分析与解决

错误原因

你代码里的两个关键错误导致了KeyError:

  • row[my_df1.Column_B]:my_df1.Column_B返回的是整个Column_B列的所有数据,而非列名。row是按列名索引的Series,用整列数据当索引自然找不到对应键,直接触发KeyError。
  • row[my_df1.Column_A]:同样错误,应该直接用列名索引当前行的Column_A值。

修正后的代码

基础修正版

def find_matching_value(row):
    # 用列名索引当前行的Column_B值,分割后转float(过滤空字符串)
    a_values = [float(x) for x in row['Column_B'].split('#') if x != '']
    # 用列名索引当前行的Column_A值,判断是否在列表中
    if row['Column_A'] in a_values:
        return row['Column_A']
    else:
        return None

# 直接在原df上生成Column_C,或按需求赋值给my_df2
my_df1['Column_C'] = my_df1.apply(find_matching_value, axis=1)

更高效的优化版(避免循环apply)

如果数据量较大,apply循环效率偏低,可以用字符串匹配或正则实现,性能更优:

# 简单字符串匹配:给Column_B前后加#,确保匹配完整值
my_df1['Column_C'] = my_df1.apply(
    lambda row: row['Column_A'] if f"#{row['Column_A']}#" in f"#{row['Column_B']}#" else None,
    axis=1
)

# 正则匹配(更严谨,处理首尾无#的情况)
import re
my_df1['Column_C'] = my_df1.apply(
    lambda row: row['Column_A'] if re.search(rf'(^#|#){row["Column_A"]}(#|$)', row['Column_B']) else None,
    axis=1
)

补充说明

  • 数据类型匹配:如果Column_A是float类型,分割后的字符串转float后会自动对齐精度(比如16.99和16.990000转float后是同一个值,不影响匹配)。
  • 空值处理:如果Column_B存在NaN值,建议先填充空字符串避免报错:my_df1['Column_B'] = my_df1['Column_B'].fillna('')

内容的提问来源于stack exchange,提问作者Brandon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:42:22