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

使用Pandas apply函数生成新列时遇KeyError: 'b'问题求助

问题解决:KeyError: 'b' 原因及修正

错误原因

你的df.apply()默认是**按列(axis=0)**执行的,这时候lambda里的row指代的是整个列的Series对象,而不是单行数据,自然找不到索引'b',所以抛出KeyError。要按行处理必须指定axis=1参数。

修正后的apply代码

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1, 1, 1, 1, 1], 'b': [np.nan, np.nan, 2, 2, 2]})
# 指定axis=1按行遍历
df['c'] = df.apply(lambda row: row['a'] if np.isnan(row['b']) else row['b'], axis=1)

注意:规则逻辑的一致性

你描述的规则是「当列B不为NaN时,列C等于列A;否则列C等于列B」,但当前代码的逻辑是当B是NaN时取A,否则取B,和你描述的正好相反。如果要匹配你说的规则,代码应该改成:

df['c'] = df.apply(lambda row: row['a'] if not np.isnan(row['b']) else row['b'], axis=1)

更高效的替代方案

用pandas内置的矢量化操作比apply按行遍历效率高得多,尤其是处理大数据集时:

  • 实现代码里的逻辑(B为NaN时取A,否则取B):
df['c'] = df['b'].fillna(df['a'])
  • 实现你描述的规则(B不为NaN时取A,否则取B):
df['c'] = np.where(df['b'].notna(), df['a'], df['b'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:34:57