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

使用pandas.loc同时设置多列时触发“Not in index error!”问题排查

问题原因与解决方法

你的代码写法存在问题,报错的核心原因是**stat和delta这两列原本不存在于DataFrame的列索引中**。在Pandas的部分版本或严格索引校验场景下,直接通过.loc给不存在的列赋值会触发"Not in index"错误(旧版Pandas可能会自动新增列,但这种行为并不稳定)。

正确写法示例

方法1:预先初始化目标列

先在DataFrame中新增并初始化stat和delta列,再通过.loc完成条件赋值:

import pandas as pd
df = pd.DataFrame(
    [[5, 2], [3, 5], [5, 5], [8, 9], [90, 55]],
    columns=['max_speed', 'shield']
)
# 提前创建目标列并赋予初始值
df['stat'] = ''
df['delta'] = 0
# 执行条件赋值
mask = df.max_speed > df.shield
df.loc[mask, ['stat', 'delta']] = 'overspeed', df.loc[mask, 'max_speed'] - df.loc[mask, 'shield']

方法2:用DataFrame构造赋值内容(更严谨)

通过构造匹配索引的DataFrame来完成赋值,既可以自动新增列,又能确保行匹配准确:

import pandas as pd
df = pd.DataFrame(
    [[5, 2], [3, 5], [5, 5], [8, 9], [90, 55]],
    columns=['max_speed', 'shield']
)
mask = df.max_speed > df.shield
# 构造仅包含符合条件行的赋值数据
assign_data = pd.DataFrame({
    'stat': 'overspeed',
    'delta': df.loc[mask, 'max_speed'] - df.loc[mask, 'shield']
}, index=df[mask].index)
# 完成赋值(自动新增stat和delta列)
df.loc[mask, ['stat', 'delta']] = assign_data

额外说明

  • 避免直接使用全量的df['max_speed'] - df['shield'],仅计算符合条件行的差值可以减少不必要的计算开销。
  • 明确指定索引能避免因行顺序变化导致的赋值错误,提升代码稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:35:29