2016-03-18 238 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]) 

在这种情况下,列表必须具有相同的长度。