python #pandas #string #dataframe #replace
#python #панды #строка #dataframe #заменить
Вопрос:
У меня есть набор данных. Вот столбец ‘Name’:
0 Braund, Mr. Owen Harris
1 Cumings, Mrs. John Bradley (Florence Briggs Th...
2 Heikkinen, Miss. Laina
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
...
151 Pears, Mrs. Thomas (Edith Wearne)
152 Meo, Mr. Alfonzo
153 van Billiard, Mr. Austin Blyler
154 Olsen, Mr. Ole Martin
155 Williams, Mr. Charles Duane
и нужно извлечь имя, статус и второе имя. Когда я пробую это на простой строке, все в порядке:
full_name="Braund, Mr. Owen Harris"
first_name=full_name.split(',')[0]
second_name=full_name.split('.')[1]
print('First name:',first_name)
print('Second name:',second_name)
status = full_name.replace(first_name, '').replace(',','').split('.')[0]
print('Status:',status)
>First name: Braund
>Second name: Owen Harris
>Status: Mr
Но после попытки сделать это с pandas я терплю неудачу со статусом:
df['first_Name'] = df['Name'].str.split(',').str.get(0) #its ok, worsk well
Но после этого:
status= df['Name'].str.replace(df['first_Name'], '').replace(',','').split('.').str.get(0)
Я получаю ошибку:
>>TypeError: 'Series' objects are mutable, thus they cannot be hashed
Каковы возможные решения?
Редактировать: Спасибо за ответы и извлечение столбцов. Я делаю
def extract_name_data(row):
row.str.extract('(?P<first_name>[^,] ), (?P<status>w .) (?P<second_name>[^(] w) ?')
last_name = row['second_name']
title = row['status']
first_name = row['first_name']
return first_name, second_name, status
и получаем
AttributeError: 'str' object has no attribute 'str'
Что можно сделать? Строка должна быть df[‘Name’]
Ответ №1:
Вы могли бы использовать str.extract
с именованными группами захвата:
df['Name'].str.extract('(?P<first_name>[^,] ), (?P<status>w .) (?P<second_name>[^(] w) ?')
вывод:
first_name status second_name
0 Braund Mr. Owen Harris
1 Cumings Mrs. John Bradley
2 Heikkinen Miss. Laina
3 Futrelle Mrs. Jacques Heath
4 Allen Mr. William Henry
5 Pears Mrs. Thomas
6 Meo Mr. Alfonzo
7 van Billiard Mr. Austin Blyler
8 Olsen Mr. Ole Martin
9 Williams Mr. Charles Duane
Комментарии:
1. вау, чувак, потрясающе
2. @mozway спасибо! можете ли вы ответить на отредактированный вопрос или я должен сделать из этого новый вопрос?
3. @NikitaTsekhanovich непонятно, что вы хотите сделать, почему функция? Вы не должны применять вещи строка за строкой. Как я показал вам, это наиболее эффективно, вы напрямую получаете полный фрейм данных со всей информацией. Пожалуйста, укажите ожидаемый результат.
4. @mozway Task starter хочет дополнительно другой способ решения в виде функции, где вводом является тот же фрейм данных (возможно, строка — это плохое название для него). На выходе — те самые столбцы: second_name, status, first_name
5. Запуск задачи? Извините, я не понимаю, чего вы хотите. Если вам нужны отдельные строки, либо подмножьте строку и примените то же самое, либо извлеките весь фрейм данных, как я показал, и выполните итерацию по строкам вывода
Ответ №2:
Вы также можете поместить свои исходные коды с небольшими изменениями в .apply()
функцию Pandas, чтобы она работала, следующим образом:
Просто замените имена ваших переменных в Python именами столбцов в Pandas. Например, замените full_name
на x['Name']
и first_name
на x['first_Name']
внутри лямбда-функции .apply()
функции:
df['status'] = df.apply(lambda x: x['Name'].replace(x['first_Name'], '').replace(',','').split('.')[0], axis=1)
Хотя, возможно, это не самый эффективный способ сделать это, это способ легко модифицировать существующие коды на Python в работоспособную версию в Pandas.
Результат:
print(df)
Name first_Name status
0 Braund, Mr. Owen Harris Braund Mr
1 Cumings, Mrs. John Bradley (Florence Briggs Th... Cumings Mrs
2 Heikkinen, Miss. Laina Heikkinen Miss
3 Futrelle, Mrs. Jacques Heath (Lily May Peel) Futrelle Mrs
4 Allen, Mr. William Henry Allen Mr
151 Pears, Mrs. Thomas (Edith Wearne) Pears Mrs
152 Meo, Mr. Alfonzo Meo Mr
153 van Billiard, Mr. Austin Blyler van Billiard Mr
154 Olsen, Mr. Ole Martin Olsen Mr
155 Williams, Mr. Charles Duane Williams Mr