у меня есть этот набор данных
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 = '')Я повторил один и тот же код для всех префиксов, но у меня при этом ничего не происходит. Любая причина для этого?
Заранее спасибо.






Вы можете использовать регулярное выражение для замены части строки. Например:
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 Вот почему я добавил ? в регулярное выражение. Он будет соответствовать DR, MR и MRS
Используйте регулярное выражение:
import re
name = "DR. ADAM SMITH"
print(re.sub(r".*\.\s", "", name)) # ADAM SMITH
Это выражение соответствует всему, что заканчивается точкой и пробелом, и должно соответствовать большинству префиксов («DR.», «MRS.», «MR.» и т. д.). Вы можете интегрировать его в свой код следующим образом:
Добавьте строку import re вверху вашего кода.
Используйте строку 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)
Я не эксперт по регулярным выражениям, но будет ли это работать, если строка в нижнем регистре?
Нет, не будет, но все примеры в верхнем регистре. Вы можете использовать case=False, чтобы сделать его нечувствительным к регистру.
Вы были почти там. Вам нужно было добавить .str:
df['Name'] = df['Name'].str.replace('DR. ', '')
Это не заменит "MRS.", как хотел ОП.
''' # Образец данных данные = { «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)
Используйте регулярное выражение, чтобы удалить слово, оканчивающееся на
..