Tengo un marco de datos con varias instancias de ' *Winner*'
después del nombre de la persona. Me gustaría eliminar esto para que solo quede su nombre. A continuación se muestra una versión simplificada de esto:
Data = {'YEAR': [2020, 2020, 2020], 'NAME': [ 'Tom *Winner*', 'Dick *Winner*', 'Harry *Winner*']} df = pd.DataFrame(Data) df['NAME'] = df['NAME'].str.replace(' [*]Winner[*]', '') df
Lo que resulta en esto:
YEAR NAME 0 2020 Tom 1 2020 Dick *Winner* 2 2020 Harry
Así que mi pregunta es ¿cuál es la diferencia entre la etiqueta ' *Winner*'
de Dick y las otras dos? ¿Por qué no se elimina este? ¿Hay una mejor manera de lograr esto?
Como una nota extra confusa, simplemente copié mi código anterior y lo volví a ejecutar (asumiendo que así es como la gente aquí podría probarlo) y elimina la etiqueta ' *Winner*'
de Dick. Entonces, algo sobre mis datos originales es diferente y se elimina cuando se pega aquí. No estoy seguro de cómo ayudar a reproducirlo siendo este el caso.
Editar: por solicitud de @ user17242583, aquí está el resultado de df.to_dict()
{'NAME': {0: 'Tom *Winner*', 1: 'Dick\xa0*Winner*', 2: 'Harry *Winner*'}, 'YEAR': {0: 2020, 1: 2020, 2: 2020}}
Prueba esto:
df['NAME'] = df['NAME'].str.replace('\s*\*Winner\*', '', regex=True)
Producción:
>>> df YEAR NAME 0 2020 Tom 1 2020 Dick 2 2020 Harry
La razón por la que funciona es porque sus datos tienen un \xa0
, que es un espacio delgado que no se rompe . En su código original, tiene un espacio codificado, pero mi código usa \s*
que significa "0 o más caracteres de espacio en blanco", que incluye \xa0
(código de caracteres 160).