Pandas处理DataFrame报float对象无between属性错误如何解决
问题解决方法
错误原因
- 你遍历
df['col1']得到的i是Python原生浮点数值,float类型没有between方法,这是报错的直接原因:between是Pandas Series/Index对象专属的方法,不能用在单个数值上。 - 你的遍历逻辑存在多处问题:
df['col2'].value_counts()返回的是每个区间的样本计数,循环取到的j是整数类型的计数值,不是你要判断的区间范围- 代码中使用的
inter_list未定义,即便跳过前一步也会触发名称错误
正确实现方案
pd.cut本身支持直接传入labels参数,不需要自己写循环做匹配,一步就能得到你要的标签结果。如果你要使用自定义的区间和对应标签,直接定义bins分组边界即可,实现代码如下:
import pandas as pd l2=[29.69911764705882, 32.5, 32.5, 54.0, 12.0, 29.69911764705882, 24.0, 29.69911764705882, 45.0, 33.0, 20.0, 47.0, 29.0, 25.0, 23.0, 19.0, 37.0, 16.0, 24.0, 29.69911764705882, 22.0, 24.0, 19.0, 18.0, 19.0, 27.0, 9.0, 36.5, 42.0, 51.0, 22.0, 55.5, 40.5, 29.69911764705882, 51.0, 16.0, 30.0, 29.69911764705882, 29.69911764705882, 44.0, 40.0, 26.0, 17.0, 1.0, 9.0, 29.69911764705882, 45.0, 29.69911764705882, 28.0, 61.0, 4.0, 1.0, 21.0, 56.0, 18.0, 29.69911764705882, 50.0, 30.0, 36.0, 29.69911764705882, 29.69911764705882, 9.0, 1.0, 4.0, 29.69911764705882, 29.69911764705882, 45.0, 40.0, 36.0, 32.0, 19.0, 19.0, 3.0, 44.0, 58.0, 29.69911764705882, 42.0, 29.69911764705882, 24.0, 28.0, 29.69911764705882, 34.0, 45.5, 18.0, 2.0, 32.0, 26.0, 16.0, 40.0, 24.0, 35.0, 22.0, 30.0, 29.69911764705882, 31.0, 27.0, 42.0, 32.0, 30.0, 16.0, 27.0, 51.0, 29.69911764705882, 38.0, 22.0, 19.0, 20.5, 18.0, 29.69911764705882, 35.0, 29.0, 59.0, 5.0, 24.0, 29.69911764705882, 44.0, 8.0, 19.0, 33.0, 29.69911764705882, 29.69911764705882, 29.0, 22.0, 30.0, 44.0, 25.0, 24.0, 37.0, 54.0, 29.69911764705882, 29.0, 62.0, 30.0, 41.0, 29.0, 29.69911764705882, 30.0, 35.0, 50.0, 29.69911764705882, 3.0] df = pd.DataFrame({'col1': l2}) # 自定义分组区间,顺序从小到大,和标签一一对应 custom_bins = [0,7,13,19,25,31,37,43,49,55,62] labels = ['0-7','7-13','13-19','19-25','25-31','31-37','37-43','43-49','49-55','55-62'] # 直接生成标签列,include_lowest=True保证最小值被包含进第一个区间 df['col2'] = pd.cut(df['col1'], bins=custom_bins, labels=labels, include_lowest=True) # 直接转成目标列表 new_list = df['col2'].tolist() print(new_list)
如果你需要用自动分10组的逻辑,不需要自定义区间,也可以直接读取pd.cut返回的分类编码映射标签,不需要循环判断:
# 自动分10组 df['col2'] = pd.cut(df['col1'], 10) # 获取自动生成的区间顺序,调整你的labels顺序和它对应后直接映射 auto_bin_order = df['col2'].cat.categories.tolist() # 把你的labels按auto_bin_order的顺序调整后执行映射 adjusted_labels = ['对应第一个区间标签','对应第二个区间标签', ...] # 按实际顺序替换 new_list = [adjusted_labels[x] for x in df['col2'].cat.codes]
内容的提问来源于stack exchange,提问作者john johns
相关产品推荐
相关产品推荐

