Substitua todas as strings exceto palavras específicas ao usar pandas python replace string [duplicar]

Dec 03 2020

Estou formando uma nova coluna em um dataframe do pandas e quero inserir o nome abreviado para sistemas operacionais. Estou usando regex e preciso fazer a correspondência exata de palavras para excluir da seleção, no entanto, quando altero o regex para não selecionar as palavras, ele para a correspondência exata. Eu li o maior número possível de posts de correspondência exata de regex aqui e nenhuma das soluções funciona.

então, por exemplo, tenho dados semelhantes a estes:

Android 10kdsh
Chrome OS
Linux ddk2
OS X 10.
Windows 7
iOS c

e eu quero que fique assim:

Android 
Chrome
Linux
OS X
Windows
iOS

Tentei o código a seguir:

def short_OS(webchat):

    webchat["OS"] = webchat["Operating System"].str.replace(('[^(Android|^OS X|^Chrome|^Linux|^Windows|^iOS)]'),"", regex = True)

    return webchat

mas isso deixa alguns dos personagens saindo:

Androiddsh
ChromeOS
Linuxdd
OS X
Windows
iOS

obviamente, os itens acima são apenas exemplos, mas o princípio sobre alguns dos caracteres serem deixados como estão nas palavras são os mesmos.

Devo observar que enquadrar as palavras com \ b não mudou o resultado. e se eu usar $ para o final da string, no exemplo do 'Android' ainda deixa '10kdsh' na mesma linha

Alguém pode ajudar por favor?

obrigado

Respostas

1 Thefourthbird Dec 03 2020 at 22:24

Em vez de substituir, você pode combinar uma das alternativas e extraí-la para uma nova coluna.

webchat = pd.DataFrame(data, columns=["Operating System"])
webchat["OS"] = webchat["Operating System"].str.extract((r"^(Android|Chrome|Linux|OS X|Windows|iOS)\b"))
print(webchat)

Resultado

  Operating System       OS
0   Android 10kdsh  Android
1        Chrome OS   Chrome
2       Linux ddk2    Linux
3         OS X 10.     OS X
4        Windows 7  Windows
5            iOS c      iOS
MizzH Dec 04 2020 at 05:15

Usando a abordagem de @O quarto pássaro, resolvi isso usando o seguinte código:

def short_OS(webchat):
 
    webchat["OS"] = webchat["Operating System"].str.extract(r"(\bAndroid\b|\bOS X\b|\bChrome\b|\bLinux\b|\bWindows\b|\biOS\b)")

    return webchat

o / b ao redor das palavras era necessário para capturar as palavras exatas