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

