修改pandas中的DataFrame

时间:2016-03-18 13:11:17

标签: python pandas dataframe

我使用pandas挖掘数据。我有一个DataFrame - 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。 我怎么能做对的?

3 个答案:

答案 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上循环,此外,改变你正在迭代的容器并不是一个好主意,因为它会产生奇怪的行为,例如它有时会起作用或者它不会

答案 1 :(得分: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])

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

答案 2 :(得分: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.

同样,这更适用于自动化阵列中大型唯一值的过程。

Orignal DataFrame

   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