Как извлечь статус в полном имени в столбце pd.Dataframe?

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