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

Rya*_*ler 2 python replace pandas

我有一个数据框,其中包含' *Winner*'该人姓名后的几个实例。我想删除这个,这样就只剩下他们的名字了。其简化版本如下:

\n
Data = {'YEAR': [2020, 2020, 2020],\n        'NAME': [ 'Tom *Winner*', 'Dick\xc2\xa0*Winner*', 'Harry *Winner*']}\ndf = pd.DataFrame(Data)\ndf['NAME'] = df['NAME'].str.replace(' [*]Winner[*]', '')\ndf\n
Run Code Online (Sandbox Code Playgroud)\n

结果是这样的:

\n
    YEAR    NAME\n0   2020    Tom\n1   2020    Dick *Winner*\n2   2020    Harry\n
Run Code Online (Sandbox Code Playgroud)\n

' *Winner*'所以我的问题是迪克的标签与其他两个标签有什么不同?为什么这个不被删除?有更好的方法来实现这一点吗?

\n

作为一个额外令人困惑的说明,我只是复制了上面的代码并重新运行它(假设这就是这里的人们可能测试它的方式),它确实删除了迪克的' *Winner*'标签。因此,我的原始数据的某些内容有所不同,并且在粘贴到此处时被删除。在这种情况下,不知道如何帮助重现它。

\n

编辑:根据@user17242583的请求,这是结果df.to_dict()

\n
{'NAME': {0: 'Tom *Winner*', 1: 'Dick\\xa0*Winner*', 2: 'Harry *Winner*'},\n 'YEAR': {0: 2020, 1: 2020, 2: 2020}}\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

尝试这个:

df['NAME'] = df['NAME'].str.replace('\s*\*Winner\*', '', regex=True)
Run Code Online (Sandbox Code Playgroud)

输出:

>>> df
   YEAR   NAME
0  2020    Tom
1  2020   Dick
2  2020  Harry
Run Code Online (Sandbox Code Playgroud)

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