我正在尝试替换数据帧的一列中的值 . 列(“女性”)仅包含“女性”和“男性”的值 .
我尝试过以下方法:
w['female']['female']='1'
w['female']['male']='0'
但是收到以前结果的完全相同的副本 .
理想情况下,我希望得到一些类似于以下循环元素的输出 .
if w['female'] =='female':
w['female'] = '1';
else:
w['female'] = '0';
我查看了陷阱文档(http://pandas.pydata.org/pandas-docs/stable/gotchas.html),但无法弄清楚为什么没有发生 .
任何帮助将不胜感激 .
10 回答
见pandas.DataFrame.replace() docs .
轻微变化:
这应该也有效:
如果我理解正确,你想要这样的东西:
(这里我将值转换为数字而不是包含数字的字符串 . 如果你真的想要,你可以将它们转换为
"1"
和"0"
,但我想要那样 . )你的代码不起作用的原因是因为在列上使用
['female']
(w['female']['female']
中的第二个'female'
)并不意味着"select rows where the value is 'female'" . 这意味着选择索引为'female'的行,其中DataFrame中可能没有任何行 .您可以使用loc编辑数据框的子集:
在这种情况下:
你也可以使用
apply
和.get
即w['female'] = w['female'].apply({'male':0, 'female':1}.get)
:Dataframe
w
:使用
apply
替换字典中的值:结果:
如果数据框中列的所有可能值都在字典中定义,则应使用带有字典的 Note:
apply
,对于未在字典中定义的那些,它将为空 .另外,还有内置函数pd.get_dummies用于这些类型的赋值:
这为您提供了一个包含两列的数据框,每个列对应于w ['female']中出现的每个值,其中您放弃第一列(因为您可以从剩下的那个中推断出它) . 新列将自动命名为您替换的字符串 .
如果您的分类变量具有两个以上的可能值,则此功能尤其有用 . 此函数创建区分所有情况所需的虚拟变量 . 请注意,不要将整个数据框分配到单个列,而是如果w ['female']可以是“男性”,“女性”或“中性”,请执行以下操作:
然后你会留下两个新的列给你一个“女性”的虚拟编码,然后你用字符串去除了列 .
这非常紧凑:
另一个好的:
pandas
中还有一个名为factorize的函数,您可以使用它自动执行此类工作 . 它将标签转换为数字:['male', 'female', 'male'] -> [0, 1, 0]
. 有关更多信息,请参阅this answer .我认为应该指出在上面建议的所有方法中你会得到哪种类型的对象:是Series还是DataFrame .
当您通过
w.female.
或w[[2]]
(其中,假设,2是您的列号)获得列时,您将返回DataFrame . 因此,在这种情况下,您可以使用.replace
之类的DataFrame方法 .当您使用
.loc
或iloc
时,您将返回Series,而Series没有.replace
方法,因此您应该使用apply
,map
等方法 .