【问题标题】:Pandas .str.replace not replacing all instances in a tablePandas .str.replace 不替换表中的所有实例
【发布时间】:2022-01-11 03:21:58
【问题描述】:

我有一个数据框,在这个人的名字后面有几个 ' *Winner*' 实例。我想删除它,所以只保留他们的名字。其简化版本如下:

Data = {'YEAR': [2020, 2020, 2020],
        'NAME': [ 'Tom *Winner*', 'Dick *Winner*', 'Harry *Winner*']}
df = pd.DataFrame(Data)
df['NAME'] = df['NAME'].str.replace(' [*]Winner[*]', '')
df

结果如下:

    YEAR    NAME
0   2020    Tom
1   2020    Dick *Winner*
2   2020    Harry

所以我的问题是,Dick 的' *Winner*' 标签与其他两个标签有何不同?为什么这个不被删除?有没有更好的方法来做到这一点?

作为一个额外令人困惑的说明,我只是复制了上面的代码并重新运行它(假设这里的人们可能会这样测试它)并且它确实删除了 Dick 的 ' *Winner*' 标签。所以关于我的原始数据的一些东西是不同的,并且在粘贴到这里时会被删除。在这种情况下不知道如何帮助重现它。

编辑:每个来自@user17242583 的请求,这里是df.to_dict() 的结果

{'NAME': {0: 'Tom *Winner*', 1: 'Dick\xa0*Winner*', 2: 'Harry *Winner*'},
 'YEAR': {0: 2020, 1: 2020, 2: 2020}}

【问题讨论】:

  • " 所以我的原始数据有些不同,粘贴到这里时会被删除。"那我们不可能帮你。 “在这种情况下,不确定如何帮助重现它。”当您尝试使用 Pandas 仅提取导致问题的行并从中创建一个 dict(在结果 DataFrame 或 Series 上使用 .to_dict)时会发生什么?
  • 顺便说一句,如果您只想匹配文字*s,请不要使用那种正则表达式语法来转义这些符号;只是告诉熊猫不要使用正则表达式。也就是说,您得到了一个需要正则表达式的答案(基于猜测数据中的实际问题)。
  • @Ryan 您可以尝试将df.to_dict() 的输出添加到问题中吗?我很想知道你的数据有什么问题。
  • 是的!这是法语文本中经常使用的细长、不间断的空格字符。我会更新我的答案。
  • 抱歉@Ryan,我没有看到你的最后评论! ` characters aren't treated as literal ` 字符。它们导致后面的一些字符被转义...阅读更多here

标签: python pandas replace


【解决方案1】:

试试这个:

df['NAME'] = df['NAME'].str.replace('\s*\*Winner\*', '', regex=True)

输出:

>>> df
   YEAR   NAME
0  2020    Tom
1  2020   Dick
2  2020  Harry

有效的原因是您的数据有一个\xa0,即thin, non-breaking space。在您的原始代码中,您有一个硬编码的空格,但我的代码使用 \s*,这意味着“0 个或多个任何空白字符”,其中包括 \xa0(字符代码 160)。

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2015-06-11
    • 2020-01-09
    • 1970-01-01
    • 2023-01-12
    • 2017-02-06
    相关资源
    最近更新 更多