Заменить всю строку, кроме определенных слов, при использовании pandas python replace string [дубликат]

Dec 03 2020

Я формирую новый столбец в фрейме данных pandas и хочу ввести краткое имя для операционных систем. Я использую регулярное выражение и мне нужно точное совпадение слов, чтобы исключить из выбора, однако, когда я изменяю регулярное выражение, чтобы не выбирать слова, оно прекращает точное совпадение. Я прочитал здесь как можно больше сообщений с точным соответствием регулярных выражений, и ни одно из решений не работает.

так, например, у меня есть данные, которые выглядят так:

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

и я хочу, чтобы это выглядело так:

Android 
Chrome
Linux
OS X
Windows
iOS

Я пробовал код следующим образом:

def short_OS(webchat):

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

    return webchat

но это оставляет некоторые символы как уходящие:

Androiddsh
ChromeOS
Linuxdd
OS X
Windows
iOS

очевидно, что приведенное выше - всего лишь примеры, но принцип того, что некоторые символы остаются в словах, тот же.

Я должен отметить, что вставка слов в \ b не повлияла на результат. и если я использую $ для конца строки, в примере с «Android» он все равно оставляет «10kdsh» в той же строке

кто-нибудь может помочь, пожалуйста?

благодарю вас

Ответы

1 Thefourthbird Dec 03 2020 at 22:24

Вместо замены вы можете сопоставить одну из альтернатив, извлечь ее в новый столбец.

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)

Вывод

  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

Используя подход @The 4th Bird, я решил эту проблему с помощью следующего кода:

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

/ b вокруг слов был необходим для точного определения слов