Python 根据字符串比较有条件地替换数据帧中的值

Python 根据字符串比较有条件地替换数据帧中的值,python,string,pandas,Python,String,Pandas,我有一个熊猫数据框,如下所示,有3列。我想比较每一列,看看该值是否与特定字符串匹配,如果匹配,则用NaN替换该值 例如,如果数据框的第1列中有5个值: abcd abcd defg abcd defg 如果比较字符串为defg,则数据框中第1列的最终结果应为 abcd abcd NaN abcd NaN 可以使用设置基于布尔条件的值: import numpy as np df["col_name"] = np.where(df["col_name"]=="defg", np.nan, df

我有一个熊猫数据框,如下所示,有3列。我想比较每一列,看看该值是否与特定字符串匹配,如果匹配,则用NaN替换该值

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

abcd
abcd
defg
abcd
defg
如果比较字符串为
defg
,则数据框中第1列的最终结果应为

abcd
abcd
NaN
abcd
NaN
可以使用设置基于布尔条件的值:

import numpy as np
df["col_name"] = np.where(df["col_name"]=="defg", np.nan, df["col_name"])
显然,用实际的列名替换
col\u name

另一种方法是使用pandas
.loc
就地更改数据帧中的值:

df.loc[df["col_name"]=="defg", "col_name"] = np.nan
可以使用设置基于布尔条件的值:

import numpy as np
df["col_name"] = np.where(df["col_name"]=="defg", np.nan, df["col_name"])
显然,用实际的列名替换
col\u name

另一种方法是使用pandas
.loc
就地更改数据帧中的值:

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

您可以使用
掩码
,这将用NaN替换整个数据帧中的“defg”:

df.mask(df == 'defg')
输出:

      0
0  abcd
1  abcd
2   NaN
3  abcd
4   NaN
您也可以对列执行此操作:

df['col1'].mask(df['col1'] == 'defg')
或者按照@pygo在其解决方案中的建议使用replace

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

您可以使用
掩码
,这将用NaN替换整个数据帧中的“defg”:

df.mask(df == 'defg')
输出:

      0
0  abcd
1  abcd
2   NaN
3  abcd
4   NaN
您也可以对列执行此操作:

df['col1'].mask(df['col1'] == 'defg')
或者按照@pygo在其解决方案中的建议使用replace

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

使用pandas内置解决方案,使用
replace
方法作为regex和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
结果:

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

使用pandas内置解决方案,使用
replace
方法作为regex和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
结果:

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

有很多解决方案。。。如果你想练习使用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

经过一些单元测试后,处理时间可能比上面的解决方案慢一点。

有很多解决方案。。。如果你想练习使用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

虽然经过一些单元测试,处理时间可能比上面的解决方案慢一点。

我得到一个TypeError:与此进行无效类型比较,它将一个系列与一个Str进行比较?我得到一个TypeError:与此进行无效类型比较,它将一个系列与Str进行比较?@Scott Boston-如果我只想在特定列中进行替换,而不是在整个数据集中进行替换,这是如何工作的?@pseudocode425,请尝试我提供的备选答案,我已经举例说明了创建列
col1
。然而,对于Scott的答案,只需像
df.col1.mask(df=='defg')
那样尝试,就可以给出您的问题。@Scott Boston-如果我只想替换特定列而不是整个数据集,这是如何工作的?@pseudocode425,请尝试我提供的备选答案,我以创建列
col1
为例进行了说明。但是,对于Scott的答案,只需像
df.col1.mask(df=='defg')
那样尝试,就可以给出你想要的内容。@pseudocode425,如果任何解决方案对你有效且最合适,那么就接受它作为答案!@伪代码425,如果任何一种解决方案对您有效且最合适,那么接受它作为答案!