如何将连续值按间隔2转换为序数?附随机数据集处理示例
按固定间隔(如间隔2)为连续值生成序数的方法
若需从连续值生成序数,如何按间隔2进行划分?若拥有100条递增数据,我可使用cut函数创建2个或50个分箱;但面对随机数据集时,例如某列值为
[1,2,3,2,2,4,5,10,15,20],按间隔5生成序数得到[1,1,1,1,1,1,1,2,2,3],那按间隔2处理随机数据集该如何操作?以下是我创建2个分箱的代码:
import pandas as pd import numpy as np np.random.seed(10) df = pd.DataFrame({ 'normal': np.random.normal(10, 3, 1000), 'chi': np.random.chisquare(4, 1000) }) pd.cut(df['normal'], 2)
两种可行方法
方法一:用pd.cut自定义固定间隔分箱
pd.cut不止能指定分箱数量,还可以手动设置分箱区间,实现固定间隔划分:
步骤:
- 先找数据集的最小、最大值;
- 生成间隔为2的分箱数组;
- 用
pd.cut划分数据,同时给每个分箱分配序数标签。
示例:处理你给的随机数组
data = [1,2,3,2,2,4,5,10,15,20] min_val = min(data) max_val = max(data) # 生成间隔2的分箱,最后多补一个值保证最大值被包含 bins = np.arange(min_val, max_val + 2, 2) # 生成从1开始的序数标签 labels = range(1, len(bins)) # 划分数据,include_lowest=True确保最小值被放进第一个分箱 result = pd.cut(data, bins=bins, labels=labels, include_lowest=True) print(result.tolist()) # 输出:[1, 1, 2, 1, 1, 2, 3, 5, 8, 10]
处理你的df['normal']列
series = df['normal'] min_val = series.min() max_val = series.max() # 如果最小值不是整数,先向下取整让分箱对齐(比如2.1就从2开始) adjusted_min = np.floor(min_val) bins = np.arange(adjusted_min, max_val + 2, 2) labels = range(1, len(bins)) df['normal_ordinal'] = pd.cut(series, bins=bins, labels=labels, include_lowest=True)
方法二:用数学运算直接计算(更高效)
如果是大数据集,直接用整数除法算序数更快,不用生成分箱数组:
逻辑:
假设间隔是2,序数从1开始,计算每个值和最小值的差,除以2取整后加1就行。要是想从0开始计数,去掉+1即可。
示例:处理你给的随机数组
data = [1,2,3,2,2,4,5,10,15,20] step = 2 min_val = min(data) ordinal = [((x - min_val) // step) + 1 for x in data] print(ordinal) # 输出:[1, 1, 2, 1, 1, 2, 3, 5, 8, 10]
处理你的df['normal']列
用numpy的向量化运算,速度更快:
step = 2 min_val = df['normal'].min() df['normal_ordinal'] = ((df['normal'] - min_val) // step).astype(int) + 1
小提示
- 要是想让分箱从0开始对齐(比如[0,2), [2,4)...),把
min_val换成0就行; pd.cut默认是左闭右开区间,include_lowest=True能确保最小值被包含在第一个区间里;- 数学运算方法速度快,适合大数据;
pd.cut能直观看到分箱区间,适合需要验证分箱范围的场景。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

