Python DataFrame无法为连续数据创建分类分桶问题求助
DataFrame连续列分桶错误排查与修复
问题描述
我是Python新手,没法给DataFrame里的CURRENT_BALANCE连续数据列做分类分桶。用了下面的嵌套if循环代码,结果所有行都被分到了0-25k,求帮忙排查问题:
POS_Bucket = [] for elements in range(0,len(df['CURRENT_BALANCE'])): if elements <= 25000: POS_Bucket.append('0-25k') elif elements <= 50000: POS_Bucket.append('25k-50k') elif elements <= 75000: POS_Bucket.append('50k-75k') else: POS_Bracket.append('100k+') df['POS_Bucket'] = POS_Bucket
错误输出如下:
CURRENT_BALANCE POS_Bucket 0 14563.60 0-25k 1 11821.56 0-25k 2 15137.84 0-25k 3 19230.03 0-25k 4 16465.54 0-25k 5 24075.32 0-25k 6 32743.42 0-25k 7 20940.93 0-25k 8 7587.90 0-25k 9 5996.65 0-25k 10 9880.96 0-25k 11 88134.33 0-25k 12 9877.01 0-25k 13 9871.71 0-25k 14 134955.88 0-25k 15 9880.96 0-25k 16 30336.07 0-25k 17 4792.58 0-25k 18 9244.03 0-25k 19 22151.48 0-25k 20 9028.78 0-25k 21 9847.32 0-25k 22 16970.26 0-25k 23 325830.34 0-25k 24 9847.32 0-25k
错误原因
- 循环变量用错:你遍历的是
range(0, len(df['CURRENT_BALANCE'])),得到的是行索引的数值(0、1、2...),不是CURRENT_BALANCE列的实际余额值。所以只要索引小于25000,都会被分到0-25k,这就是所有结果一致的核心原因。 - 变量名笔误:最后一行用了
POS_Bracket.append,但你的列表名是POS_Bucket,运行时会直接报错。
修复方案
方案1:修正循环逻辑
直接遍历CURRENT_BALANCE列的实际值,同时修正变量名笔误:
POS_Bucket = [] # 遍历余额列的每一个实际值 for balance in df['CURRENT_BALANCE']: if balance <= 25000: POS_Bucket.append('0-25k') elif balance <= 50000: POS_Bucket.append('25k-50k') elif balance <= 75000: POS_Bucket.append('50k-75k') else: POS_Bucket.append('100k+') df['POS_Bucket'] = POS_Bucket
方案2:用Pandas内置方法pd.cut(更高效简洁)
Pandas专门提供了pd.cut函数处理连续数据分桶,不用手动写循环:
import pandas as pd # 定义分桶区间:0-25k, 25k-50k, 50k-75k, 75k以上 bins = [0, 25000, 50000, 75000, float('inf')] # 对应每个区间的标签 labels = ['0-25k', '25k-50k', '50k-75k', '100k+'] # 直接生成分桶列 df['POS_Bucket'] = pd.cut(df['CURRENT_BALANCE'], bins=bins, labels=labels, include_lowest=True)
include_lowest=True:确保数值刚好等于0的行能被分到第一个桶float('inf'):匹配所有超过75000的数值,避免遗漏大额数据
内容的提问来源于stack exchange,提问作者Karanpreet Singh
相关产品推荐
相关产品推荐

