我有一个数据框,该列的大学排名如下: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
我的问题是我无法将它们分为一些数字,例如字符串。所以我不确定该怎么做。
答案 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)
您可以使用mask
和pd.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