我使用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
。
我怎么能做对的?
答案 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