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

使用条件语句与循环处理Pandas列分箱时遇KeyError问题求助

问题解决及优化方案

首先,你遇到的KeyError: 'B'是因为你的DataFrame里没有名为B的列——根据你的描述,你应该是想引用Cabin列,这里明显是个笔误。

其次,你的代码存在几个pandas使用上的问题:

  • 错误的索引方式:training[i,"Cnum"]这种写法不符合pandas规范,应该用.loc或.iloc来定位行和列
  • 逻辑运算符使用错误:&是元素级的与操作,但需要给每个条件加括号(运算符优先级问题),否则会得到错误的逻辑判断结果
  • 循环遍历行效率极低:pandas的核心优势是向量化操作,逐行循环是最不推荐的写法

以下是修正后的代码,完全采用向量化操作,既高效又简洁:

# 假设你的Cabin列名为'Cabin',如果不是请替换成实际列名
condition = (training['Cabin'] == 'B') & (training['Cnum'] >= 63) & (training['Cnum'] <= 100)
# 方式一:布尔值映射为0/1
training['Forward'] = condition.map({True: 0, False: 1})
# 方式二:取反后转整数(更简洁)
training['Forward'] = (~condition).astype(int)

代码解释

  1. 条件构建:用括号包裹每个条件,确保逻辑判断顺序正确,&用于实现元素级的与运算
  2. 赋值操作:两种写法都能实现需求,方式二利用布尔值转整数的特性(True转1,False转0),取反后正好匹配你的逻辑规则

如果你确实需要使用apply方法(虽然向量化操作效率更高),也可以这样写:

def assign_forward(row):
    # 替换'Cabin'为实际列名
    if row['Cabin'] == 'B' and 63 <= row['Cnum'] <= 100:
        return 0
    else:
        return 1

training['Forward'] = training.apply(assign_forward, axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:55:35