我有如下3列的pandas数据框。我想比较每一列,以查看该值是否与特定字符串匹配,如果是,则将其替换为NaN。
例如,如果数据框的第1列中有5个值:
abcd
abcd
defg
abcd
defg
并且如果比较字符串是defg
,则数据框中第1列的最终结果应该是。
abcd
abcd
NaN
abcd
NaN
答案 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
尽管经过一些单元测试,但处理时间可能比上述解决方案要慢一些。