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

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')。

错误原因分析

你遇到的问题主要有两个:

  1. apply默认按列处理,而非行
    Pandas的df.apply()默认参数axis=0,也就是会把每一列作为参数传给你的函数,而不是每一行。这时候函数里的x是整列的Series,它的索引是行号,自然找不到'UK_midi'这个索引值,所以报错。

  2. 函数没有返回值
    就算你解决了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:00:16