如果部分字符串匹配,则替换整个数据框中的值

时间:2020-06-04 10:46:43

标签: python pandas replace re

如果字符串的一部分匹配,我试图替换整个数据框中的值。我尝试使用df.replace df.str.contains等,但是它们都不起作用。这是类似的问题,但它们没有回答我的问题[示例] [1]:

我有这样的datframe: df

Brand                        2Brand                         3Brand
Audi                          BMW                           None of the above
None from list                BMW                           Audi
None                          None below or above           BMW
NaN                           Audi                          NaN

我只想替换任何地方都不会出现。

所需的otput是这样的:

Brand                        2Brand                         3Brand
Audi                          BMW                           None
None                          BMW                           Audi
None                          None                          BMW
NaN                           Audi                          NaN

2 个答案:

答案 0 :(得分:2)

DataFrame.mask中每列中使用Series.str.containsDataFrame.apply,以避免转换可能的NoneNaN值使用na=False参数:< / p>

df = df.mask(df.apply(lambda x: x.str.contains('None', na=False)), 'None')
print (df)
  Brand 2Brand 3Brand
0  Audi    BMW   None
1  None    BMW   Audi
2  None   None    BMW

编辑:如果可能,某些数字列使用DataFrame.select_dtypes仅获取字符串列(显然对象吃了字符串),然后将其添加到由DataFrame.reindex填充的False的掩码数字列中:

print (df)
            Brand               2Brand             3Brand  col
0            Audi                  BMW  None of the above    4
1  None from list                  BMW               Audi    7
2            None  None below or above                BMW    9
3             NaN                 Audi                NaN    5

mask = (df.select_dtypes(object)
          .apply(lambda x: x.str.contains('None', na=False))
          .reindex(df.columns, fill_value=False, axis=1))
df = df.mask(mask, None)
print (df)
  Brand 2Brand 3Brand  col
0  Audi    BMW   None    4
1  None    BMW   Audi    7
2  None   None    BMW    9
3   NaN   Audi    NaN    5

答案 1 :(得分:1)

使用applymapmask

In [1732]: df.mask(df.applymap(lambda x: 'None' in x), None)
Out[1732]: 
  Brand 2Brand 3Brand
0  Audi    BMW   None
1  None    BMW   Audi
2  None   None    BMW