2016-03-18 280 views
2

我使用pandas來挖掘數據。我有一個數據幀 - data修改熊貓數據框

Age Sex  Name 
0 28 male Kirill 
1 32 female Alina 
2 12 female Sasha 

我想更換Sex到兩位數,而不是male使用1,而不是female - 0

我試圖在循環:

for i in range(data.Age.size()): 
    if data.Sex[i]=='male' 
     data.Sex[i]=1 
    else: 
     data.Sex[i]=0 

但我得到SettingWithCopyWarning。 我該如何做對?

+0

你真的想達到什麼目的?新的分類數據類型可能會更好地爲您提供服務,具體取決於您在此步驟之外的目標。 –

回答

5

您可以傳遞一個字典,並呼籲map

In [21]: 
sex = {'male':1, 'female':0} 
df['Sex'] = df['Sex'].map(sex) 
df 

Out[21]: 
    Age Sex Name 
0 28 1 Kirill 
1 32 0 Alina 
2 12 0 Sasha 

,或者給蒙面DF 2個呼叫:

In [25]: 
df.loc[df['Sex']=='male','Sex'] = 1 
df.loc[df['Sex']=='female','Sex'] = 0 
df 

Out[25]: 
    Age Sex Name 
0 28 1 Kirill 
1 32 0 Alina 
2 12 0 Sasha 

一般來說,你應該避免循環在DF時有矢量化解決方案可用,另外它不是一個好主意,因爲它可以產生奇怪的行爲,例如它有時可以工作,或者它不會。

0

要添加到他們的方法中,如果您不想自己明確定義字典,那麼如果您有多個唯一值(即5+),可以更好地自動執行此過程。

import numpy as np 
import pandas as pd 

sex = np.sort(df['Sex'].unique()) # extract unique values and sorts them alphabetically 
sex_dict = dict(enumerate(sex)) # creates a dictionary from the array above 
sex_dict= dict(zip(sex_dict.values(), sex_dict.keys())) # Corrects the dictionary 

df['Sex'] = df['Sex'].map(sex_dict) # maps as described in the other answers. 

此外,這更適用於自動化數組內大的唯一值的過程。

一部開拓創新的數據幀

Age  Sex Name 
0 28 male Kirill 
1 32 female Alina 
2 12 female Sasha 

最終結果

Age Sex Name 
0 28 1 Kirill 
1 32 0 Alina 
2 12 0 Sasha 
2

可以使用replace方法,它究竟是:

data.replace({'male': 1, 
       'female': 0}) 

    Age Sex Name 
0 28 1 Kirill 
1 32 0 Alina 
2 12 0 Sasha 

data.replace(["male", "female"], [0, 1]) 

等效於:

data.replace(to_replace=["male", "female"], values=[0, 1]) 

在這種情況下,列表必須具有相同的長度。