对熊猫数据框中的列进行分类

时间:2019-06-09 07:38:59

标签: python pandas

我有一个数据框,该列的大学排名如下:1,2,3,4,5,...,99,100,101-150,151-200,201-300,301-400,401-500,>500,看起来像这样:

   Uni_Rank
    1
    3
    4
    101-150
    20
    22
    151-200
    201-300
    301-400
    10
    15
    44
    53
    70
    >500

我需要生成另一列,将其分类如下:1-10, 11-20, 21-30, 31-40, 41-50, 51-60, 61-70, 71-80, 81-90, 91-100, 101-150, 101-150,151-200,201-300,301-400,401-500,>500

我的问题是我无法将它们分为一些数字,例如字符串。所以我不确定该怎么做。

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作(只需根据需要添加更多bin边界和标签)

我假设字符串排名是您想要的最终类别

df_train_final['uni_original'] = [1,3,4,'101-150',20,22,'151-200']
bins = [0, 10, 20, 30]
names = ['1-10', '11-20', '21-30']

df_train_final['uni_rank'] = df_train_final['uni_original'].apply(lambda x: x if isinstance(x, str) else pd.cut([x], bins, labels=names)[0])

答案 1 :(得分:1)

我建议您首先将字符串转换为数字(整数会这样做),然后应用bin函数(例如pd.cut)。

import pandas as pd

s = pd.Series(['1','3','4','10','101-150','151-200','>500','53','70'])
df = s.to_frame('Uni_rank')

# handle >500
df = df.replace('>500', '501')
# extract digits and convert to integer with regex
df['Uni_rank'] = df['Uni_rank'].str.extract('(\d+)').astype(int)

# Create bins and labels
bins = [0,10,100,150,500,501]

labels = [
    '1-10', 
    '11-100',
    '101-150',
    '151-500',
    '>500'
]

df['Rank'] = pd.cut(df['Uni_rank'], bins=bins, labels=labels)

print(df)

返回:

   Uni_rank     Rank
0         1     1-10
1         3     1-10
2         4     1-10
3        10     1-10
4       101  101-150
5       151  151-500
6       501     >500
7        53   11-100
8        70   11-100

答案 2 :(得分:1)

您可以使用maskpd.to_numeric()

bins = [0,10,100,150,500] #you can add custom edges
labels = ['1-10', '11-100','101-150','151-500'] #make sure labels are 1 less than bins

m=pd.to_numeric(df.Uni_Rank,errors='coerce')
df.Uni_Rank.mask(m.notna(),pd.cut(m,bins,labels=labels))

0        1-10
1        1-10
2        1-10
3     101-150
4      11-100
5      11-100
6     151-200
7     201-300
8     301-400
9        1-10
10     11-100
11     11-100
12     11-100
13     11-100
14       >500