熊猫 - 替换列值

Sim*_*mon 19 python pandas

我知道这个问题有很多主题,但没有一种方法适合我,所以我发布了我的具体情况

我有一个如下所示的数据框:

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
Run Code Online (Sandbox Code Playgroud)

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

我是否错误地使用了replace()?或者有更好的方法来有条件地替换价值观吗?

Ana*_*mar 45

是的,您使用不正确,Series.replace()默认情况下不是就地操作,它返回替换的数据框/系列,您需要将其分配回dataFrame/Series以发生其效果.或者如果您需要在原地进行,您需要将inplace关键字参数指定为True示例 -

data['sex'].replace(0, 'Female',inplace=True)
data['sex'].replace(1, 'Male',inplace=True)
Run Code Online (Sandbox Code Playgroud)

此外,您可以replace通过使用参数和参数list两者将上述内容组合成单个函数调用,示例 -to_replacevalue

data['sex'].replace([0,1],['Female','Male'],inplace=True)
Run Code Online (Sandbox Code Playgroud)

示例/演示 -

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
Run Code Online (Sandbox Code Playgroud)

你也可以使用字典,例子 -

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
Run Code Online (Sandbox Code Playgroud)


stu*_*ent 6

您也可以尝试使用apply带get的方法dictionary,似乎比更快一点replace:

data['sex'] = data['sex'].apply({1:'Male', 0:'Female'}.get)
Run Code Online (Sandbox Code Playgroud)

测试timeit:

%%timeit
data['sex'].replace([0,1],['Female','Male'],inplace=True)
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

使用apply:

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

结果:

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
Run Code Online (Sandbox Code Playgroud)

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