Substitua todas as strings exceto palavras específicas ao usar pandas python replace string [duplicar]
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
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
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