python - 替换pandas DataFrame中的列值

我正在尝试替换数据帧的一列中的值。 列(“女性”)仅包含“女性”和“男性”的值。

我尝试过以下方法:

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)],但无法弄清楚为什么没有发生。

任何帮助将不胜感激。

Black asked 2019-09-10T14:45:34Z
10个解决方案
166 votes

如果我理解正确,你想要这样的东西:

w['female'] = w['female'].map({'female': 1, 'male': 0})

(这里我将值转换为数字而不是包含数字的字符串。如果你真的想要,可以将它们转换为['female']'female',但我不确定你为什么要这样做。)

您的代码不起作用的原因是因为在列上使用['female']w['female']['female']中的第二个'female')并不意味着“选择值为'female'的行”。 这意味着选择索引为“female”的行,其中DataFrame中可能没有。

BrenBarn answered 2019-09-10T14:46:13Z
85 votes

您可以使用loc编辑数据框的子集:

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

在这种情况下:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
Jimmy Petersson answered 2019-09-10T14:46:50Z
27 votes
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)

请参阅pandas.DataFrame.replace()docs。

jfs answered 2019-09-10T14:47:20Z
25 votes

轻微变化:

w.female.replace(['male', 'female'], [1, 0], inplace=True)
deckard answered 2019-09-10T14:47:46Z
16 votes

这应该也有效:

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0
Nick Crawford answered 2019-09-10T14:48:12Z
9 votes

你也可以使用apply.get,即

apply

w = pd.DataFrame({'female':['female','male','female']})
print(w)

数据帧apply

   female
0  female
1    male
2  female

使用apply替换字典中的值:

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

结果:

   female
0       1
1       0
2       1 

注意:如果数据框中列的所有可能值都在字典中定义,则应使用带字典的apply,对于未在字典中定义的那些,它将为空。

student answered 2019-09-10T14:49:12Z
7 votes

另外,还有内置函数pd.get_dummies用于这些类型的赋值:

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

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

如果您的分类变量具有两个以上的可能值,则此功能尤其有用。 此函数创建区分所有情况所需的虚拟变量。 请注意,不要将整个数据框分配到单个列,而是如果w ['female']可以是“男性”,“女性”或“中性”,请执行以下操作:

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

然后你会留下两个新的列,为你提供“女性”的虚拟编码,你就可以删除带有字符串的列。

galliwuzz answered 2019-09-10T14:50:06Z
5 votes

这非常紧凑:

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

另一个好的:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)
Azz answered 2019-09-10T14:50:39Z
1 votes

factorize中还有一个名为factorize的功能,您可以使用它自动执行此类工作。 它将标签转换为数字:['male', 'female', 'male'] -> [0, 1, 0]。有关详细信息,请参阅此答案。

Roald answered 2019-09-10T14:51:07Z
0 votes

我认为应该指出在上面提出的所有方法中你会得到哪种类型的对象:是Series还是DataFrame。

当您通过.lociloc(其中,假设,2是您的列号)获得列时,您将返回DataFrame。因此,在这种情况下,您可以使用DataFrame方法,如.replace

当您使用.lociloc时,您将返回系列,而系列没有.replace方法,因此您应该使用诸如applymap等方法。

Alex-droid AD answered 2019-09-10T14:51:52Z
translate from https://stackoverflow.com:/questions/23307301/replacing-column-values-in-a-pandas-dataframe