Pandas - 替换列值

27

我知道有很多关于这个问题的话题,但是没有一种方法适用于我,所以我要发帖谈论我的具体情况。

我有一个看起来像这样的数据框:

data = pd.DataFrame([[1,0],[0,1],[1,0],[0,1]], columns=["sex", "split"])
data['sex'].replace(0, 'Female')
data['sex'].replace(1, 'Male')
data

我想做的是将“性别”列中所有的0替换为“女性”,将所有的1替换为“男性”,但当我使用上述代码时,数据框内的值似乎没有改变。

我是否错误地使用了replace()函数?或者有更好的方法进行条件替换吗?

5个回答

66

是的,你使用它的方式不正确,Series.replace()默认情况下不是就地操作(inplace operation),它会返回替换后的数据帧/序列,你需要将其赋值回你的数据帧/序列才能产生效果。如果你需要在原地进行替换,那么你需要指定inplace关键字参数为True。例如 -

data['sex'].replace(0, 'Female',inplace=True)
data['sex'].replace(1, 'Male',inplace=True)

另外,你可以通过使用 list 来将上述内容组合成一个单一的 replace 函数调用,同时作为 to_replace 参数和 value 参数,例如 -

data['sex'].replace([0,1],['Female','Male'],inplace=True)

示例/演示 -

In [10]: data = pd.DataFrame([[1,0],[0,1],[1,0],[0,1]], columns=["sex", "split"])

In [11]: data['sex'].replace([0,1],['Female','Male'],inplace=True)

In [12]: data
Out[12]:
      sex  split
0    Male      0
1  Female      1
2    Male      0
3  Female      1
您也可以使用字典,例如 -
In [15]: data = pd.DataFrame([[1,0],[0,1],[1,0],[0,1]], columns=["sex", "split"])

In [16]: data['sex'].replace({0:'Female',1:'Male'},inplace=True)

In [17]: data
Out[17]:
      sex  split
0    Male      0
1  Female      1
2    Male      0
3  Female      1

1
使用字典而不是两个列表感觉更自然,我个人认为。 - DSM
如果我做类似这样的事情,我会得到一个 SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 的警告。 - Stefan Falk
你的代码是什么?也许你正在切片原始数据框(从而创建一个副本),并尝试对其进行设置? - Anand S Kumar

11
你也可以尝试使用 dictionaryget 方法与 apply 结合使用,似乎比 replace 稍微快一点:
data['sex'] = data['sex'].apply({1:'Male', 0:'Female'}.get)

使用 timeit 进行测试:

%%timeit
data['sex'].replace([0,1],['Female','Male'],inplace=True)

结果:

The slowest run took 5.83 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 510 µs per loop

使用apply

%%timeit
data['sex'] = data['sex'].apply({1:'Male', 0:'Female'}.get)

结果:

The slowest run took 5.92 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 331 µs per loop

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


这里的 get 究竟是干什么用的?你能解释一下吗?代码可行! - ababuji

2

您可以尝试这个方法!
创建一个替换值的字典。

import pandas as pd
data = pd.DataFrame([[1,0],[0,1],[1,0],[0,1]], columns=["sex", "split"])

enter image description here

replace_dict= {0:'Female',1:'Male'}
print(replace_dict)

在这里输入图片描述

使用map函数替换值

data['sex']=data['sex'].map(replace_dict)

替换后的输出结果
这里输入图片描述


0

您也可以尝试使用Numpyselect函数:

import numpy as np

data['sex'] = np.select(
    [data['sex'].eq(0), data['sex'].eq(1)], ['Female', 'Male'], default=np.nan
)

输出:

    sex     split
0   Male    0
1   Female  1
2   Male    0
3   Female  1

如果既找不到0,也找不到1,则返回NaN


0

这些答案都不适用于我,但是这个可以:

data.gender[data['gender'] == 'Male'] = 1
data.gender[data['gender'] == 'Female'] = 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接