Pandas .str.replace 不替换 table 中的所有实例

Pandas .str.replace not replacing all instances in a table

我有一个数据框,在这个人的名字后面有几个 ' *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}}

试试这个:

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。在您的原始代码中,您有一个 space 硬编码,但我的代码使用 \s* 表示“0 个或多个任何白色 space 字符”,其中包括 \xa0 (char代码 160).