Pandas中apply函数报错KeyError: 'UK_midi',求COL_MIDI赋值解决方案
解决Pandas df.apply() 处理行数据时的索引报错问题
先还原下你的场景:
你有这样的数据集:
target | date | US_midi | UK_midi | NL_midi | BE_midi | FR_midi | SP_midi | PT_midi | SU_midi | COL_MIDI 23 | 1970 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 34 | 1970 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 34 | 1970 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0
需求是:当UK_midi、NL_midi等(除了US和SU)任意一列值为1时,把COL_MIDI设为1。你写了col_checker函数,但执行df['COL_MIDI'] = df.apply(col_checker)时报错('UK_midi', 'occurred at index target')。
错误原因分析
你遇到的问题主要有两个:
apply默认按列处理,而非行
Pandas的df.apply()默认参数axis=0,也就是会把每一列作为参数传给你的函数,而不是每一行。这时候函数里的x是整列的Series,它的索引是行号,自然找不到'UK_midi'这个索引值,所以报错。函数没有返回值
就算你解决了axis的问题,你的函数没有返回任何值,apply会默认返回None,最终COL_MIDI列会被填充成NaN,达不到你想要的效果。
解决方案
方案1:修正原函数和apply调用
调整函数让它返回处理后的值,同时调用apply时指定axis=1(按行处理):
def col_checker(x): col_list = ['UK_midi', 'NL_midi', 'BE_midi', 'FR_midi', 'SP_midi', 'PT_midi'] # 检查目标列中是否有任意一个值为1 if x[col_list].any(): return 1 # 没有的话保持原0(或者直接return 0,因为初始值都是0) return x['COL_MIDI'] # 关键:添加axis=1参数,告诉apply按行处理 df['COL_MIDI'] = df.apply(col_checker, axis=1)
方案2:用向量化操作替代apply(推荐)
Pandas的行循环apply效率很低,尤其是数据集大的时候,更推荐用内置的向量化方法直接处理:
# 选中所有目标列,检查每行是否有至少一个1,再转成整数(True→1,False→0) target_cols = ['UK_midi', 'NL_midi', 'BE_midi', 'FR_midi', 'SP_midi', 'PT_midi'] df['COL_MIDI'] = df[target_cols].any(axis=1).astype(int)
这个方法不需要写循环,完全利用Pandas的向量化计算,速度快很多,代码也更简洁。
内容的提问来源于stack exchange,提问作者Jasper
相关产品推荐
相关产品推荐

