我试图替换一个数据框架的一列的值。列('female')只包含值'female'和'male'。

我尝试过以下方法:

w['female']['female']='1'
w['female']['male']='0' 

但收到的是与之前结果完全相同的副本。

理想情况下,我希望得到类似于以下循环元素的输出。

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

我已经查看了gotchas文档(http://pandas.pydata.org/pandas-docs/stable/gotchas.html),但不明白为什么什么都没有发生。

任何帮助都将不胜感激。


当前回答

轻微的变化:

w.female.replace(['male', 'female'], [1, 0], inplace=True)

其他回答

你可以使用loc编辑一个数据帧的子集:

df.loc[<row selection>, <column selection>]

在这种情况下:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1

轻微的变化:

w.female.replace(['male', 'female'], [1, 0], inplace=True)
w.female = np.where(w.female=='female', 1, 0)

如果有人在寻找一个麻木的解决方案。这对于基于条件替换值非常有用。if和else条件都是np.where()中固有的。使用df.replace()的解决方案可能是不可行的,如果列包含除'male'之外的许多唯一值,所有这些值都应该替换为0。

另一种解决方案是连续使用df.where()和df.mask()。这是因为它们都没有实现else条件。

w.female.where(w.female=='female', 0, inplace=True) # replace where condition is False
w.female.mask(w.female=='female', 1, inplace=True) # replace where condition is True

还有一个内置函数pd。Get_dummies用于这些类型的赋值:

w['female'] = pd.get_dummies(w['female'],drop_first = True)

这为您提供了一个有两列的数据帧,每一列对应出现在w['female']中的每个值,您可以删除其中的第一列(因为您可以从剩下的一列推断它)。新列将自动命名为您替换的字符串。

如果有两个以上可能值的分类变量,这尤其有用。这个函数创建了尽可能多的虚拟变量来区分所有情况。请注意,不要将整个数据帧分配到单个列中,相反,如果w['female']可以是'male', 'female'或'neutral',请执行如下操作:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

然后你剩下两个新的列,给你'female'的虚拟编码,你去掉了带字符串的列。

w.replace({'female':{'female':1, 'male':0}}, inplace = True)

上面的代码将把'female'替换为1,'male'替换为0,仅在'female'列中