在Pandas DataFrame多列使用apply函数遇KeyError,如何解决?
解决Pandas apply中的KeyError问题
嘿,我来帮你搞定这个KeyError问题!先给你拆解一下错误原因,再给你几个靠谱的解决方案。
错误原因分析
你遇到的KeyError: ('a', 'occurred at index a'),本质是因为**df.apply()默认是按列(axis=0)处理数据**的。这时候传给lambda的x是每一列的Series,而不是你以为的每一行。比如当处理列'a'时,这个Series的索引是行号(0、1、2),根本没有'a'这个索引值,自然就找不到对应的键,抛出KeyError了。
解决方案
方案1:指定axis=1按行处理
这是最直接的修复方式,给apply()加上axis=1参数,让它按行遍历数据,此时传给lambda的x就是每一行的Series,包含'a'、'b'、'c'这些列名作为索引,就能正确取值了:
import numpy as np import pandas as pd def add(a, b): return a + b df = pd.DataFrame(np.random.randn(3, 3), columns = ['a', 'b', 'c']) # 加上axis=1参数 df.apply(lambda x: add(x['a'], x['c']), axis=1)
方案2:用矢量化操作替代apply(推荐)
如果你的add函数只是简单的两列相加,完全没必要用apply——Pandas的矢量化操作效率远高于apply(apply本质是Python循环,矢量化是底层优化的C实现)。直接这样写就行:
# 直接计算两列之和 df['a'] + df['c'] # 如果要把结果保存为新列 df['sum_ac'] = df['a'] + df['c']
方案3:复杂逻辑下的遍历方式(适合复杂函数)
如果你的add函数有更复杂的逻辑,必须逐行处理,除了axis=1的apply,还可以用itertuples()或iterrows()遍历行,不过这两种速度也不如矢量化,适合特殊场景:
用itertuples()(速度更快)
result = [] for row in df.itertuples(): result.append(add(row.a, row.c)) # 转成Series pd.Series(result, index=df.index)
用iterrows()
result = [] for idx, row in df.iterrows(): result.append(add(row['a'], row['c'])) pd.Series(result, index=df.index)
总结
- 简单运算优先用矢量化操作,效率最高;
- 必须用apply的话,记得加
axis=1按行处理; - 复杂逻辑可以考虑
itertuples()或iterrows()。
内容的提问来源于stack exchange,提问作者labjunky
相关产品推荐
相关产品推荐

