使用.loc对连续数值数据进行区间分类时遇到的异常问题
问题排查与修复
核心问题原因
错误的链式比较语法
pandas的Series不支持a < Series < b这种链式比较写法,这种写法会被解析为(a < Series) < b。布尔类型的Series会被自动转为1/0,和数值b比较后得到全True的结果,但后续因为列类型变化,实际赋值无法生效。正确的多条件比较需要用&连接,且每个条件单独加括号。数据类型污染
第一个赋值语句将部分int_rate的值改为字符串"low",导致该列从数值类型变为object(混合数值与字符串)。后续对该列的数值比较会失效,因为字符串和数值无法进行有效大小判断。条件顺序逻辑错误
第三个条件15.00 < int_rate <30.00的范围完全包含在第二个条件8.00 < int_rate <=30.00内,即使前面的问题修复,先执行medium赋值再执行high赋值,high会覆盖部分medium的结果,但原代码因为前面的问题根本没执行到这一步。
修复后的代码
推荐两种写法:
写法一:使用正确的条件语法,调整执行顺序
# 先处理范围最小的high,再处理medium,最后处理low data2.loc[(data2['int_rate'] > 15.00) & (data2['int_rate'] < 30.00), 'int_rate'] = "high" data2.loc[(data2['int_rate'] > 8.00) & (data2['int_rate'] <= 15.00), 'int_rate'] = "medium" data2.loc[data2['int_rate'] <= 8.00, 'int_rate'] = "low"
写法二:使用pd.cut更简洁高效(推荐)
import pandas as pd bins = [-float('inf'), 8.00, 15.00, 30.00] labels = ['low', 'medium', 'high'] data2['int_rate'] = pd.cut(data2['int_rate'], bins=bins, labels=labels, include_lowest=True)
验证结果
用你提供的测试数据,修复后会得到:
- 7.90 → low
- 9.91、10.65、12.69、13.49、14.65 → medium
- 15.27、15.96、16.29、18.64、21.28 → high
内容的提问来源于stack exchange,提问作者Ayush Jaiswal
相关产品推荐
相关产品推荐

