Remplacez toute la chaîne à l'exception des mots spécifiques lors de l'utilisation de pandas python replace string [duplicate]

Dec 03 2020

Je forme une nouvelle colonne dans un dataframe pandas et je veux entrer le nom court des systèmes d'exploitation. J'utilise regex et j'ai besoin d'exclure des mots de correspondance exacte pour les exclure de la sélection, mais lorsque je change l'expression régulière pour ne pas sélectionner les mots, cela arrête la correspondance exacte. J'ai lu autant de publications de mots de correspondance exacte regex ici que possible et aucune des solutions ne fonctionne.

donc par exemple j'ai des données qui ressemblent à ceci:

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

et je veux que ça ressemble à ceci:

Android 
Chrome
Linux
OS X
Windows
iOS

J'ai essayé le code comme suit:

def short_OS(webchat):

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

    return webchat

mais cela laisse certains des personnages comme partant:

Androiddsh
ChromeOS
Linuxdd
OS X
Windows
iOS

évidemment, ce ne sont que des exemples, mais le principe selon lequel certains des caractères sont laissés tels quels dans les mots sont les mêmes.

Je dois noter que l'encadrement des mots avec \ b n'a pas changé le résultat. et si j'utilise le $ pour la fin de la chaîne, dans l'exemple de 'Android', il laisse toujours le '10kdsh' sur la même ligne

Quelqu'un peut-il aider s'il vous plaît?

Je vous remercie

Réponses

1 Thefourthbird Dec 03 2020 at 22:24

Au lieu de remplacer, vous pouvez faire correspondre l'une des alternatives pour l'extraire dans une nouvelle colonne.

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)

Production

  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

En utilisant l'approche de @Le quatrième oiseau, j'ai résolu ce problème en utilisant le code suivant:

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

le / b entourant les mots était nécessaire pour capturer les mots exacts