Удаление префикса из столбца имен в python

у меня есть этот набор данных

ID      Name     
101    DR. ADAM SMITH
102    BEN DAVIS
103    MRS. ASHELY JOHNSON
104    DR. CATHY JONES 
105    JOHN DOE SMITH

Желаемый результат

ID        Name 
101     ADAM SMITH
102     BEN DAVIS
103     ASHELY JOHNSON
104     CATHY JONES
105     JOHN DOE SMITH 

Мне нужно избавиться от префикса Я пробовал df['Name'] = df['Name'].replace(to_replace = 'DR. ', value = '')Я повторил один и тот же код для всех префиксов, но у меня при этом ничего не происходит. Любая причина для этого?

Заранее спасибо.

Используйте регулярное выражение, чтобы удалить слово, оканчивающееся на ..

Barmar 01.06.2023 22:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
51
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете использовать регулярное выражение для замены части строки. Например:

df['Name'] = df['Name'].str.replace(r'^(?:DR|MRS?)\.\s*', '', regex=True)
print(df)

Отпечатки:

    ID            Name
0  101      ADAM SMITH
1  102       BEN DAVIS
2  103  ASHELY JOHNSON
3  104     CATHY JONES
4  105  JOHN DOE SMITH

Примечание: .replace(r'DR. ', '') пытается заменить всю DR. пустой строкой, а не только ее часть.

Что, если бы строка была "MR. JOHN SMITH"?

TheTridentGuy 01.06.2023 23:12

@TheTridentGuy Вот почему я добавил ? в регулярное выражение. Он будет соответствовать DR, MR и MRS

Andrej Kesely 01.06.2023 23:15

Используйте регулярное выражение:

import re

name = "DR. ADAM SMITH"
print(re.sub(r".*\.\s", "", name)) # ADAM SMITH 

Это выражение соответствует всему, что заканчивается точкой и пробелом, и должно соответствовать большинству префиксов («DR.», «MRS.», «MR.» и т. д.). Вы можете интегрировать его в свой код следующим образом:

  1. Добавьте строку import re вверху вашего кода.

  2. Используйте строку df['Name'] = re.sub(r".*\.\s", "", df['Name']) вместо df['Name'] = df['Name'].replace(to_replace = 'DR. ', value = '')

Подробнее о регулярных выражениях см.: https://www.w3schools.com/python/python_regex.asp

Ответ принят как подходящий

Используйте регулярное выражение для соответствия первому слову, если оно заканчивается на ..

df['Name'] = df['Name'].str.replace(r'^[A-Z]+\.\s+', '', regex=True)

Я не эксперт по регулярным выражениям, но будет ли это работать, если строка в нижнем регистре?

TheTridentGuy 01.06.2023 22:23

Нет, не будет, но все примеры в верхнем регистре. Вы можете использовать case=False, чтобы сделать его нечувствительным к регистру.

Barmar 01.06.2023 22:28

Вы были почти там. Вам нужно было добавить .str:

df['Name'] = df['Name'].str.replace('DR. ', '')

Это не заменит "MRS.", как хотел ОП.

TheTridentGuy 01.06.2023 22:21

''' # Образец данных данные = { «ID»: [101, 102, 103, 104, 105], 'Имя': ['ДР. АДАМ СМИТ», «БЕН ДЭВИС», «МИССИС. ЭШЛИ ДЖОНСОН», «ДР. КЭТИ ДЖОНС, ДЖОН ДОУ СМИТ] }

# Create a DataFrame
df = pd.DataFrame(data)

# Function to remove prefixes from names
def remove_prefix(name):
    prefixes = ['DR.', 'MRS.', 'MR.', 'MS.']  # Add more prefixes if needed
    for prefix in prefixes:
        if name.startswith(prefix):
            return name[len(prefix)+1:]
    return name

# Apply the function to the 'Name' column
df['Name'] = df['Name'].apply(remove_prefix)

# Print the modified DataFrame
print(df)

'''

Причина, по которой ничего не происходит, когда вы используете функцию replace(), заключается в том, что она обрабатывает ввод как литеральную строку и ищет точное совпадение.

В вашем случае значения в столбце «Имя» содержат дополнительные пробелы до и после префиксов, поэтому точное совпадение не найдено.

Чтобы решить эту проблему, вы можете использовать регулярные выражения (регулярные выражения) из модуля re, чтобы удалить префиксы из столбца «Имя»:

import re
import pandas as pd

data = {
    'ID': [101, 102, 103, 104, 105],
    'Name': ['DR. ADAM SMITH', 'BEN DAVIS', 'MRS. ASHELY JOHNSON', 'DR. CATHY JONES', 'JOHN DOE SMITH']
}

df = pd.DataFrame(data)
df['Name'] = df['Name'].apply(lambda x: re.sub(r'\b(?:DR\.|MRS\.)\s*', '', x))

print(df)

Другие вопросы по теме