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

