【问题标题】:Replacing value in whole dataframe if part of the string match如果部分字符串匹配,则替换整个数据框中的值
【发布时间】:2020-09-23 07:50:02
【问题描述】:

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

我有这样的数据框: df

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

我只想在没有出现的地方替换。

想要的输出应该是这样的:

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

【问题讨论】:

  • 仍然无法处理真实数据?

标签: python pandas replace re


【解决方案1】:

在DataFrame.apply 中的每列使用DataFrame.mask 和Series.str.contains,以避免转换可能的None 和NaN 值使用na=False 参数:

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 仅获取字符串列(显然对象吃字符串),然后添加到由False 填充的掩码数字列DataFrame.reindex:

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

【讨论】:

  • 谢谢,但我有很多列,不想更改所有数据类型,因为我需要应用于整个 df。有些列没有 str 数据类型...所以我收到此错误AttributeError: Can only use .str accessor with string values!
  • 我不想更改 NaN 值。它们应该保持为 NaN。我只想更改关键字“无”的地方。它可以工作,但它也将所有 NaN 值更改为“无”。
  • @s_khan92 - 你需要替换为None 像Nonetype 还是像None 像字符串'None' ?
  • 只有一个字符串“None”
  • @s_khan92 - 好的,所以需要将('None', na=True) 更改为('None', na=False) 和df.mask(mask, None) 更改为df.mask(mask, 'None')
【解决方案2】:

使用applymap 和mask:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2019-10-08
    • 2021-07-11
    • 1970-01-01
    • 2019-12-10
    • 2017-11-17
    • 1970-01-01
    • 2017-09-09
    相关资源
    最近更新 更多