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

如何移除pandas qcut区间的小数点(转换为整数区间)

解决qcut生成区间的浮点数转整数问题

看起来你已经用pd.qcut实现了十分位划分,只是纠结区间里的浮点数怎么转成整数对吧?毕竟precision=0只会给数字加个.0,完全不是想要的效果。

首先得明确:直接把区间边界转成整数确实会改变原本的十分位分布(就像@ALollz提醒的那样),不过你也说了只是用于展示,那完全没问题,下面给你两种可行的方法:

方法一:直接修改已生成的区间列

如果你已经生成了Decile_interval列,我们可以通过apply遍历每个区间,把左右边界转成整数后重新构造Interval对象:

import random
import pandas as pd
random.seed(420) #blazeit
example = pd.DataFrame({"Score":[random.randrange(350, 1000) for i in range(1000)]})
example["Decile"] = pd.qcut(example["Score"], 10, labels=False) + 1
example["Decile_interval"] = pd.qcut(example["Score"], 10)

# 转换区间边界为整数
example["Decile_interval_int"] = example["Decile_interval"].apply(
    lambda interval: pd.Interval(
        int(interval.left), 
        int(interval.right), 
        closed=interval.closed  # 保留原区间的闭合方式
    )
)

要是觉得左边界取整后和你的分数起始范围(350)不太贴合,也可以把int(interval.left)改成math.ceil(interval.left),这样左边界就会自动向上取整到350这类整数。

方法二:先处理分位点再生成区间

另一种思路是先计算十分位的分位点,把分位点转成整数后再用qcut划分,这样生成的区间从一开始就是整数边界:

# 计算十分位分位点并转成整数
quantiles = example["Score"].quantile([i/10 for i in range(11)]).astype(int)
# 去重避免qcut报错(如果有重复分位点的话)
quantiles = quantiles.unique()

# 用处理后的分位点生成区间
example["Decile_interval_int"] = pd.qcut(example["Score"], q=quantiles, duplicates="drop")
# 同步更新十分位编号
example["Decile"] = pd.qcut(example["Score"], q=quantiles, labels=False, duplicates="drop") + 1

这种方法会直接基于整数分位点划分,不过要注意如果分位点有重复,duplicates="drop"会自动合并重复的区间——这也是为什么会改变分布的原因,但用于展示完全够用。

另外补充下:precision=0参数只是控制浮点数的显示精度,并不会改变底层的数据类型,所以才会出现x.0的情况,想要真正的整数边界,还是得用上面的两种方法来处理。

内容的提问来源于stack exchange,提问作者Arturo Sbr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:28:42