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
相关产品推荐
相关产品推荐

