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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:55:36