如何基于指定步长动态为Pandas DataFrame添加分箱列?
问题描述
现有如下DataFrame:
import pandas as pd df = pd.DataFrame({'a': range(100, 111)})
需要为其添加列b,期望输出如下:
a b 0 100 NaN 1 101 NaN 2 102 NaN 3 103 1 4 104 1 5 105 1 6 106 2 7 107 2 8 108 2 9 109 3 10 110 3
设定步长值为3,分箱规则:a列值在103-106之间时b列为1,106-109之间时b列为2,以此类推。曾尝试使用pd.cut手动指定区间,但因其他样本分箱数量无法预先确定,需要无需手动指定区间的解决方案。
解决方案
可以通过数学计算直接推导分箱值,无需手动定义区间,适配任意范围的a列数据:
方法一:基于numpy.where的直接计算
核心逻辑:以起始分箱阈值(103)为基准,计算每个a值与基准的偏移量,按步长做整数除法后加1得到分箱标签,小于基准的值设为NaN。
import pandas as pd import numpy as np df = pd.DataFrame({'a': range(100, 111)}) step = 3 # 指定步长 start_threshold = 103 # 第一个分箱的起始值 # 计算列b df['b'] = np.where( df['a'] >= start_threshold, ((df['a'] - start_threshold) // step) + 1, np.nan )
方法二:自动生成区间的pd.cut实现
如果偏好使用pd.cut,可以自动生成符合规则的区间列表,再进行分箱:
import pandas as pd import numpy as np df = pd.DataFrame({'a': range(100, 111)}) step = 3 start_threshold = 103 # 自动生成区间:包含左侧最小值,然后从start_threshold开始按步长生成到最大值+step max_val = df['a'].max() bins = [df['a'].min()] + list(range(start_threshold, max_val + step, step)) # 分箱并调整标签:labels=False返回0起始的索引,加1后匹配需求,include_lowest=False保证左开右闭 df['b'] = pd.cut(df['a'], bins=bins, labels=False, include_lowest=False) + 1 # 把小于start_threshold的NaN补回 df.loc[df['a'] < start_threshold, 'b'] = np.nan
两种方法都能自动适配任意范围的a列数据,无需预先确定分箱数量。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

