如何使用熊猫将连续数字转换为分类数字?

问题描述

我几天来一直在寻找这个问题的解决方案,但不幸的是没有成功。

我在这样的列中有连续值:

Val: 1,15,2,91,52,126

我需要将这些数字作为间隔转换为类别。例如,第一个数字应该属于 (1-10) 类别

我知道我们可以使用 pd.cut

定义间隔并转换数据
pd.cut(df.val,right=False)

但我的问题是我无法定义区间,因为我有数百万的价值。

理想的解决方案是我可以定义区间范围,然后它会自动搜索值并将其转换为该类别。

这将是我理想的输出:

Val     Val_Cat
1        1-10
15       10-20
2        1-10
91       90-100
52       50-60
126      120-130

解决方法

您可以使用所需的相应类别创建一个新列:

def cat(x): 
    return str(x//10*10) + '-' + str((x//10*10)+10)

df['Val_cat']=list(map(cat,df.Val))
,

一个想法是使用数学用整数除以 // 乘以 10,然后乘以 10 并最后转换为字符串(如有必要,可以使用 repalce):

s = df['Val'] // 10 * 10
df['new'] = s.replace(0,1).astype(str) + '-' + (s + 10).astype(str)
print (df)
   Val  Val_Cat      new
0    1     1-10     1-10
1   15    10-20    10-20
2    2     1-10     1-10
3   91   90-100   90-100
4   52    50-60    50-60
5  126  120-130  120-130

带有 f-string 的替代:

df['new'] = df['Val'].map(lambda x: f'{x//10*10}-{(x//10*10)+10}')
print (df)
   Val  Val_Cat      new
0    1     1-10     0-10
1   15    10-20    10-20
2    2     1-10     0-10
3   91   90-100   90-100
4   52    50-60    50-60
5  126  120-130  120-130

您的切割解决方案可以通过以下方式更改:

bins = np.arange(0,df['Val'].max() // 10 * 10 + 20,10)

df['new'] = pd.cut(df.Val,bins = bins,right=False)
print (df)
   Val  Val_Cat         new
0    1     1-10     [0,10)
1   15    10-20    [10,20)
2    2     1-10     [0,10)
3   91   90-100   [90,100)
4   52    50-60    [50,60)
5  126  120-130  [120,130)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...