使用条件语句与循环处理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)
代码解释
- 条件构建:用括号包裹每个条件,确保逻辑判断顺序正确,
&用于实现元素级的与运算 - 赋值操作:两种写法都能实现需求,方式二利用布尔值转整数的特性(
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
相关产品推荐
相关产品推荐

