如何移除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
相关产品推荐
相关产品推荐

