You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于指定步长动态为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:53:01