Python 根据字符串比较有条件地替换数据帧中的值
我有一个熊猫数据框,如下所示,有3列。我想比较每一列,看看该值是否与特定字符串匹配,如果匹配,则用NaN替换该值 例如,如果数据框的第1列中有5个值: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
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,如果任何一种解决方案对您有效且最合适,那么接受它作为答案!