如何正确使用pd.cut高效实现街道号的批量分箱?
解决方法
不需要手动构建超长的bins和labels,有两种简便方式实现需求:
方法一:直接数学计算(最高效)
利用整数除法的特性,一行代码就能生成目标列,比pd.cut更简洁高效:
# 生成数值型BIN df['BIN'] = ((df['STREET_NO'] - 1) // 300) * 300 # 如果需要字符串类型的BIN,加astype转换 df['BIN'] = (((df['STREET_NO'] - 1) // 300) * 300).astype(str)
逻辑说明:
- 减1是为了让
300刚好归入0的区间(否则300//300=1会得到300,不符合需求) - 整除
300得到区间的索引,再乘以300就得到对应区间的起始值
方法二:结合numpy自动生成bins(适配pd.cut)
如果坚持想用pd.cut,可以用numpy.arange自动生成所有区间分界:
import numpy as np # 生成从0开始、步长300、覆盖到99999以上的bins数组 bins = np.arange(0, 99999 + 300, 300) # labels直接取bins的前n-1个元素,转成字符串 labels = bins[:-1].astype(str) # 用pd.cut分箱,include_lowest=True确保左边界包含第一个区间的最小值 df['BIN'] = pd.cut(x=df['STREET_NO'], bins=bins, labels=labels, include_lowest=True)
内容的提问来源于stack exchange,提问作者FutureDataScientist
相关产品推荐
相关产品推荐

