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
相关产品推荐
相关产品推荐

