2017-05-29 58 views
2

我仍然在學習python,並且我有一個屬於相當大的矩陣的向量,並且此向量中的條目是對象類型的。他們是('< 1年','1年','2年'等) 我想分別改爲0,1,2,3。我寫了以下工作的行,但必須有更簡單的解決方案,它不需要循環用10個條件:Python中矩陣中的多個字符替換

import numpy as np 
import pandas as pd 

data_file = pd.read_csv('loan.csv') 

emp_length=data_file.emp_length 
emp_len=[] 
for i in range(len(emp_length)): 
    if emp_length[i]=='< 1 year': 
     emp_len.append(0) 
    elif emp_length[i]=='1 year': 
     emp_len.append(1) 
    elif emp_length[i]=='2 years': 
     emp_len.append(2) 
    elif emp_length[i]=='3 years': 
     emp_len.append(3) 
    elif emp_length[i]=='4 years': 
     emp_len.append(4) 
    elif emp_length[i]=='5 years': 
     emp_len.append(5) 
    elif emp_length[i]=='6 years': 
     emp_len.append(6) 
    elif emp_length[i]=='7 years': 
     emp_len.append(7) 
    elif emp_length[i]=='8 years': 
     emp_len.append(8) 
    elif emp_length[i]=='9 years': 
     emp_len.append(9) 
    elif emp_length[i]=='10+ years': 
     emp_len.append(10) 
    else: 
     emp_len.append(0) 

我並不需要創建新載體,但是這是解決方案,我是能夠自己想出來。如果無論如何要替換同一個向量中的條目,它會更好。謝謝你的任何建議和幫助

回答

2

考慮數據框df

np.random.seed([3,1415]) 
df = pd.DataFrame(dict(emp_length=np.random.choice(list(m.keys()), 20))) 
print(df) 

    emp_length 
0 < 1 year 
1  2 years 
2 10+ years 
3 10+ years 
4  7 years 
5 10+ years 
6  3 years 
7  8 years 
8  7 years 
9 10+ years 
10 < 1 year 
11 6 years 
12 8 years 
13 6 years 
14 < 1 year 
15 10+ years 
16 2 years 
17 < 1 year 
18 4 years 
19 9 years 

你可以使用mapreplace與字典

m = { 
    '< 1 year': 0, 
    '1 year': 1, 
    '2 years': 2, 
    '3 years': 3, 
    '4 years': 4, 
    '5 years': 5, 
    '6 years': 6, 
    '7 years': 7, 
    '8 years': 8, 
    '9 years': 9, 
    '10+ years': 10 
} 

data_file.emp_length.map(m) 
# or equivalently 
# data_file.emp_length.replace(m) 

0  0 
1  2 
2  10 
3  10 
4  7 
5  10 
6  3 
7  8 
8  7 
9  10 
10  0 
11  6 
12  8 
13  6 
14  0 
15 10 
16  2 
17  0 
18  4 
19  9 
Name: emp_length, dtype: int64 

你也使用分類型

cats = ['< 1 year', '1 year', '2 years', '3 years', '4 years', '5 years', '6 years', '7 years', '8 years', '9 years', '10+ years'] 
c = df.emp_length.astype('category', categories=cats, ordered=True) 
print(c) 

0  < 1 year 
1  2 years 
2  10+ years 
3  10+ years 
4  7 years 
5  10+ years 
6  3 years 
7  8 years 
8  7 years 
9  10+ years 
10  < 1 year 
11  6 years 
12  8 years 
13  6 years 
14  < 1 year 
15 10+ years 
16  2 years 
17  < 1 year 
18  4 years 
19  9 years 
Name: emp_length, dtype: category 
Categories (11, object): [< 1 year < 1 year < 2 years < 3 years ... 7 years < 8 years < 9 years < 10+ years] 

然後,你可以用

c.cat.codes 

0  0 
1  2 
2  10 
3  10 
4  7 
5  10 
6  3 
7  8 
8  7 
9  10 
10  0 
11  6 
12  8 
13  6 
14  0 
15 10 
16  2 
17  0 
18  4 
19  9 
dtype: int8 
+0

巨大訪問映射整數!非常感謝你,雖然我認爲pd.factorize不起作用,因爲在例如'10 +年'的情況下,它將返回1,但地圖非常有幫助 –

+1

如果答案有幫助,請不要忘記[接受](http:/ /meta.stackexchange.com/a/5235/295067)。謝謝。 – jezrael

+1

這是一個很好的答案! – MaxU

相關問題