熊猫根据字符串比较有条件地替换数据框中的值

时间:2018-12-17 17:04:32

标签: python string pandas

我有如下3列的pandas数据框。我想比较每一列,以查看该值是否与特定字符串匹配,如果是,则将其替换为NaN。

例如,如果数据框的第1列中有5个值:

abcd
abcd
defg
abcd
defg

并且如果比较字符串是defg,则数据框中第1列的最终结果应该是。

abcd
abcd
NaN
abcd
NaN

4 个答案:

答案 0 :(得分:1)

您可以使用numpy where根据布尔条件设置值:

import numpy as np
df["col_name"] = np.where(df["col_name"]=="defg", np.nan, df["col_name"])

显然,用您的实际列名替换col_name

一种替代方法是使用熊猫.loc来更改DataFrame中的值:

df.loc[df["col_name"]=="defg", "col_name"] = np.nan

答案 1 :(得分:1)

您可以使用mask,这将用NaN替换整个数据框中的'defg':

df.mask(df == 'defg')

输出:

      0
0  abcd
1  abcd
2   NaN
3  abcd
4   NaN

您也可以在列中执行此操作

df['col1'].mask(df['col1'] == 'defg')

或在他的解决方案中使用@pygo建议替换

df['col1'].replace('defg',np.nan)

答案 2 :(得分:1)

使用pandas内置解决方案使用replace方法作为正则表达式,使用inplace方法使其在数据框中永久存在,同时使用numpy将匹配值替换为NaN

import pandas as pd
import numpy as np

示例数据框:

df
   col1
0  abcd
1  abcd
2  defg
3  abcd
4  defg

结果:

df['col1'].replace(['defg'], np.nan, regex=True, inplace=True)
   df
       col1
    0  abcd
    1  abcd
    2   NaN
    3  abcd
    4   NaN

答案 3 :(得分:0)

有很多解决方案...如果您想练习使用lambda函数,则可以始终这样做...

df['Col1'] = df.Col1.apply(lambda x: np.nan if x == 'defg' else x)

结果:

0  abcd
1  abcd
2   NaN
3  abcd
4   NaN
Seconds:  0.0020899999999999253

尽管经过一些单元测试,但处理时间可能比上述解决方案要慢一些。