替换pandas DataFrame中的列值

Bla*_*ack 113 python pandas

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

我尝试过以下方法:

w['female']['female']='1'
w['female']['male']='0' 
Run Code Online (Sandbox Code Playgroud)

但是收到以前结果的完全相同的副本.

理想情况下,我希望获得一些类似于以下循环元素的输出.

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';
Run Code Online (Sandbox Code Playgroud)

我查看了陷阱文档(http://pandas.pydata.org/pandas-docs/stable/gotchas.html),但无法弄清楚为什么没有发生.

任何帮助将不胜感激.

Bre*_*arn 204

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

w['female'] = w['female'].map({'female': 1, 'male': 0})
Run Code Online (Sandbox Code Playgroud)

(这里我将值转换为数字而不是包含数字的字符串.您可以将它们转换为"1""0",如果您真的想要,但我不确定您为什么要这样做.)

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

  • 如果列中的所有值都在map函数中给出,则仅使用此选项.在map函数中未指定的列值将替换为nan. (10认同)
  • 谢谢.正是我在寻找什么.如果我将'女性'映射为1,将其他任何东西映射为'0'.那会怎么样? (4认同)
  • 我用 .replace 而不是 .map (3认同)
  • 我还建议使用`.loc` 语法来避免`SettingWithCopyWarning`:https://pandas.pydata.org/pandas-docs/stable/indexing.html#different-choices-for-indexing (2认同)

小智 100

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

df.loc[<row selection>, <column selection>]
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
Run Code Online (Sandbox Code Playgroud)

  • @DhruvGhulati,您可以使用df.loc [:, &lt;列选择&gt;] (3认同)

jfs*_*jfs 30

w.female.replace(to_replace=dict(female=1, male=0), inplace=True)
Run Code Online (Sandbox Code Playgroud)

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

  • 这是我遇到的问题的最佳解决方案,谢谢! (2认同)

dec*_*ard 29

轻微变化:

w.female.replace(['male', 'female'], [1, 0], inplace=True)
Run Code Online (Sandbox Code Playgroud)


Nic*_*ord 19

这应该也有效:

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0
Run Code Online (Sandbox Code Playgroud)


stu*_*ent 10

您还可以使用apply.get

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

w = pd.DataFrame({'female':['female','male','female']})
print(w)
Run Code Online (Sandbox Code Playgroud)

数据帧w:

   female
0  female
1    male
2  female
Run Code Online (Sandbox Code Playgroud)

使用apply从字典替换值:

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)
Run Code Online (Sandbox Code Playgroud)

结果:

   female
0       1
1       0
2       1 
Run Code Online (Sandbox Code Playgroud)

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


use*_*855 9

w.replace({'female':{'female':1, 'male':0}}, inplace = True)
Run Code Online (Sandbox Code Playgroud)

上面的代码将仅在“女性”列中将“女性”替换为 1,将“男性”替换为 0

  • 我实际上并没有在OP的情况下尝试过,但是为“inplace”+1 (2认同)

gal*_*uzz 7

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

w['female'] = pd.get_dummies(w['female'],drop_first = True)
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个包含两列的数据框,每列对应于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)
Run Code Online (Sandbox Code Playgroud)

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


Azz*_*Azz 6

这非常紧凑:

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0
Run Code Online (Sandbox Code Playgroud)

另一个好的:

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)
Run Code Online (Sandbox Code Playgroud)

  • 第一个示例是链式索引,因此受到警告,因为它无法保证生成的 df 是副本还是视图。请参阅[链式索引](https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label) (2认同)

Erf*_*fan 6

使用Series.mapSeries.fillna

如果您的列包含的字符串多于femaleand maleSeries.map则在这种情况下将失败,因为它将返回NaN其他值。

这就是为什么我们必须将它与fillna

示例为什么.map失败

df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']})

   female
0    male
1  female
2  female
3    male
4   other
5   other
Run Code Online (Sandbox Code Playgroud)
df['female'].map({'female': '1', 'male': '0'})

0      0
1      1
2      1
3      0
4    NaN
5    NaN
Name: female, dtype: object
Run Code Online (Sandbox Code Playgroud)

对于正确的方法,我们map用 链接fillna,所以我们NaN用原始列中的值填充:

df['female'].map({'female': '1', 'male': '0'}).fillna(df['female'])

0        0
1        1
2        1
3        0
4    other
5    other
Name: female, dtype: object
Run Code Online (Sandbox Code Playgroud)