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

使用.loc对连续数值数据进行区间分类时遇到的异常问题

问题排查与修复

核心问题原因

  1. 错误的链式比较语法
    pandas的Series不支持a < Series < b这种链式比较写法,这种写法会被解析为(a < Series) < b。布尔类型的Series会被自动转为1/0,和数值b比较后得到全True的结果,但后续因为列类型变化,实际赋值无法生效。正确的多条件比较需要用&连接,且每个条件单独加括号。

  2. 数据类型污染
    第一个赋值语句将部分int_rate的值改为字符串"low",导致该列从数值类型变为object(混合数值与字符串)。后续对该列的数值比较会失效,因为字符串和数值无法进行有效大小判断。

  3. 条件顺序逻辑错误
    第三个条件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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:02:21