2017-01-21 83 views
3

假設我有:pd.Categorical.from_codes與遺漏值

df = pd.DataFrame({'gender': np.random.choice([1, 2], 10), 'height': np.random.randint(150, 210, 10)}) 

我想使性別欄分類。如果我嘗試:

df['gender'] = pd.Categorical.from_codes(df['gender'], ['female', 'male']) 

它會失敗。

我可以墊的類別

df['gender'] = pd.Categorical.from_codes(df['gender'], ['N/A', 'female', 'male']) 

但隨後'N/A'以某種方法返回:

In [67]: df['gender'].value_counts() 
Out[67]: 
female 5 
male  5 
N/A  0 
Name: gender, dtype: int64 

我想過使用None作爲填充值。它的工作原理打算在value_counts但是我得到一個警告:

opt/anaconda3/bin/ipython:1: FutureWarning: 
Setting NaNs in `categories` is deprecated and will be removed in a future version of pandas. 
    #!/opt/anaconda3/bin/python 

什麼更好的辦法來做到這一點?還有一種方法可以明確地給出從代碼到類別的映射嗎?

+0

OK,發現了'DF [ '性別'] cat.remove_unused_categories(就地= TRUE)'。仍在尋找更好的方法。 – lazy1

回答

0

您從pd.Categorical.from_codes(df['gender'], ['female', 'male'])得到的錯誤應該提醒您,您的codes需要爲0編制索引。

所以你可以簡單地使用你的DataFrame聲明。

df = pd.DataFrame({'gender': np.random.choice([0, 1], 10), 'height': np.random.randint(150, 210, 10)}) 
+0

謝謝,但在我的情況下,數據來自外部來源,我無法控制「性別」值。 – lazy1

1

您可以使用rename_categories()方法:

演示:

In [33]: df 
Out[33]: 
    gender height 
0  1  203 
1  2  169 
2  2  181 
3  1  172 
4  2  174 
5  1  166 
6  2  187 
7  2  200 
8  1  208 
9  1  201 

In [34]: df['gender'] = df['gender'].astype('category').cat.rename_categories(['male','feemale']) 

In [35]: df 
Out[35]: 
    gender height 
0  male  203 
1 feemale  169 
2 feemale  181 
3  male  172 
4 feemale  174 
5  male  166 
6 feemale  187 
7 feemale  200 
8  male  208 
9  male  201 

In [36]: df.dtypes 
Out[36]: 
gender category 
height  int32 
dtype: object 
1

直接指定新的類別,它是.categories屬性,然後將它改名爲這些值:

df['gender'] = df['gender'].astype('category') 
df['gender'].cat.categories = ['female', 'male'] 

df['gender'].value_counts() 
Out[23]: 
female 7 
male  3 
Name: gender, dtype: int64 

df.dtypes 
Out[24]: 
gender category 
height  int32 
dtype: object 

如果你想要的代碼映射器dict和它的相應的類別,然後:

old = df['gender'].cat.categories 
new = ['female', 'male'] 

dict(zip(old, new)) 
Out[28]: 
{1: 'female', 2: 'male'} 
+1

謝謝。我看到的這個問題(以及我的解決方案)不是'df ['gender']。cat.codes'在原始的'[0,1]'而不是'[1,2]'中。因爲我不認爲我會得到更好的東西,所以我會標記爲已解決。 – lazy1