2017-04-22 64 views
5

Aşağıda bir veri karesi ve bir dict var, ama dikte ile sütunu nasıl değiştirebilirim? Bir saf sayı sütunu bir sayı-anahtar kelime dict ile nasıl değiştirilir? [python]

data 
index  occupation_code 
0   10 
1   16 
2   12 
3   7 
4   1 
5   3 
6   10 
7   7 
8   1 
9   3 
10   4 
…… 

dict1 = {0: 'other',1: 'academic/educator',2: 'artist',3: 'clerical/admin',4: 'college/grad student',5: 'customer service',6: 'doctor/health care',7: 'executive/managerial',8: 'farmer',9: 'homemaker',10: 'K-12student',11: 'lawyer',12: 'programmer',13: 'retired',14: 'sales/marketing',15: 'scientist',16: 'self-employed',17: 'technician/engineer',18: 'tradesman/craftsman',19: 'unemployed',20: 'writer'} 

ben yerine yapmak için bir "için" cümlesini kullanılan, ama böyle, çok yavaş: benim veri 1000000 satırları içerir ve birkaç saniye maliyeti

for i in data.index: 
    data.loc[i,'occupation_detailed'] = dict1[data.loc[i,'occupation_code']] 

yana ben sadece koşmak eğer 1 bin kere. 1 milyon satır yarım güne mal olabilir!

Bunun için daha iyi bir yolu var mı?

Ur önerileriniz için çok teşekkürler!

cevap

7

Kullanım map ve eksik bazı değer alırsanız NaN:

print (df) 
     occupation_code 
index     
0     10 
1     16 
2     12 
3     7 
4     1 
5     3 
6     10 
7     7 
8     1 
9     3 
10     4 
11     100 <- add missing value 100 

df['occupation_code'] = df['occupation_code'].map(dict1) 
print (df) 
      occupation_code 
index      
0    K-12student 
1    self-employed 
2    programmer 
3  executive/managerial 
4   academic/educator 
5   clerical/admin 
6    K-12student 
7  executive/managerial 
8   academic/educator 
9   clerical/admin 
10  college/grad student 
11      NaN 

Başka bir çözüm replace kullanmak edilir, bazı değerlerin elde orijinal değeri eksik, hiçbir NaN:

df['occupation_code'] = df['occupation_code'].replace(dict1) 
print (df) 
      occupation_code 
index      
0    K-12student 
1    self-employed 
2    programmer 
3  executive/managerial 
4   academic/educator 
5   clerical/admin 
6    K-12student 
7  executive/managerial 
8   academic/educator 
9   clerical/admin 
10  college/grad student 
11      100 
+0

Çok hızlı çalışır! Çok teşekkürler! – Ricky

1

@ jezrael'in örnek verilerini varsayın df

print(df) 

     occupation_code 
index     
0     10 
1     16 
2     12 
3     7 
4     1 
5     3 
6     10 
7     7 
8     1 
9     3 
10     4 
11     100 

Ben lambda gömülü bir sözlük get yöntemini kullanarak öneriyoruz. Bu, sözlükte olmayan şeyler için varsayılan bir değer katmanıza olanak tanır. Bu durumda, orijinal değeri döndürürüm.

df.occupation_code.map(lambda x: dict1.get(x, x)) 

index 
0    K-12student 
1   self-employed 
2    programmer 
3  executive/managerial 
4  academic/educator 
5   clerical/admin 
6    K-12student 
7  executive/managerial 
8  academic/educator 
9   clerical/admin 
10 college/grad student 
11      100 
Name: occupation_code, dtype: object