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

pandas中pd.merge传入apply行对象触发KeyError如何解决

报错根本原因

调用apply(axis=1)逐行遍历DataFrame时,传入自定义函数的row是Series类型的一维结构,不是DataFrame:

  • 执行row[col_select_Event]取多列值时,返回的是索引为['A','B']的一维Series,没有列维度,pd.merge无法匹配到on参数指定的A、B列,直接触发KeyError。
  • 注释中EMAP[col_select_Event][1:2]的写法返回的是带A、B列名的二维DataFrame,结构符合merge的输入要求,因此不会报错。
解决方法

方法1:适配原有逐行apply逻辑

如果确实需要逐行执行自定义处理逻辑,把行Series转换为保留列名的单行DataFrame再传入merge即可:

import pandas as pd

# 样例数据初始化
EMAP = pd.DataFrame({
    'A': ['Apple', 'Orange', 'Strawberry'],
    'B': [1, 2, 3],
    'C': ['abc'] * 3
})
RCA = pd.DataFrame({
    'A': ['Apple', 'Orange'],
    'B': [1, 2]
})
col_select_Event = ['A', 'B']

def merge(row):
    # 将行Series转置为单行DataFrame,保留原列名
    a = row.to_frame().T[col_select_Event]
    filtered_RCA = pd.merge(RCA, a, on=col_select_Event, how='inner')
    # 可在此处添加自定义逐行处理逻辑
    return filtered_RCA

j = EMAP.apply(merge, axis=1)

方法2:直接整表merge(性能最优,无特殊逐行需求优先选择)

apply本质是Python层的逐行循环,执行效率极低。如果没有必须逐行处理的特殊逻辑,直接对两个DataFrame做整表关联即可,代码更简洁,数据量大时性能比逐行apply高数十到数百倍:

# 直接得到两表A、B列完全匹配的结果
filtered_RCA = pd.merge(EMAP, RCA, on=col_select_Event, how='inner')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:54:17