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

Pandas按列数值区间分配字符串值出现TypeError错误如何解决

问题排查及解决方案

报错核心原因

  • 参数传递逻辑错误:调用apply时传入的x['StartingHeight']本身是浮点型的身高数值,你在height_bands函数内又尝试用hbcol['StartingHeight']对入参做下标取值,相当于直接对float类型执行索引操作,直接触发TypeError: 'float' object is not subscriptable报错。
  • 逻辑运算符使用错误:区间判断你用了按位或运算符|,会导致只要满足任意一个边界条件就命中判断,比如所有大于0的数值都会触发第一个if分支,完全不符合区间匹配需求,多条件同时满足的判断应该使用按位与运算符&,或者直接用连续比较语法a < x < b更简洁。
  • 区间边界定义和预期输出不匹配:原代码中12的边界划分、18+区间的标签都和你给出的预期结果不符,需要调整。

修复后的自定义函数方案

直接对StartingHeight列执行apply即可,不需要遍历整行:

def height_bands(h_val):
    """根据身高数值返回对应区间字符串"""
    if 0 <= h_val < 6.1:
        return '0-6m'
    elif 6.1 <= h_val < 12.1: # 调整边界包含12的情况,匹配预期输出
        return '6-12m'
    elif 12.1 <= h_val < 18:
        return '12-18m'
    elif 18 <= h_val < 24:
        return '18-24m'
    elif 24 <= h_val < 30:
        return '24-30m'
    else:
        return '>30m'

df1['height_factor'] = df1['StartingHeight'].apply(height_bands)

更高性能的推荐方案:使用pd.cut做区间分箱

面对大数据量时,pd.cut的性能远高于自定义apply,代码也更简洁:

import pandas as pd
# 定义区间边界和对应标签,right=False表示左闭右开,匹配区间逻辑
bins = [0, 6.1, 12.1, 18, 24, 30, float('inf')]
labels = ['0-6m', '6-12m', '12-18m', '18-24m', '24-30m', '>30m']
df1['height_factor'] = pd.cut(df1['StartingHeight'], bins=bins, labels=labels, right=False)

运行以上任意一种方案,都可以得到你给出的预期输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:39:03