Как изменить строку на основе ее содержимого в Python

#python #regex #pandas

#python #регулярное выражение #pandas

Вопрос:

Я пытаюсь изменить столбец имен в наборе данных только на фамилию человека, чтобы я мог консолидироваться по семье; то есть Джон Смит, Мэри Смит, Джозетт Смит будут называться просто Смит. Я пытался использовать регулярное выражение, но не могу найти способ сообщить программе, чтобы она учитывала все значения перед «Smith». Я буду запускать его в столбце, поэтому я попытался стандартизировать его, не вводя жестко имена.

Я уже пробовал:

 child1['full_name'].replace({' * Smith':'Smith'},
                                      regex=True, inplace = True)
 

где я хотел бы знать, могу ли я поместить что-то на место звездочки, чтобы делать то, что я хочу, чтобы это делало. В настоящее время он просто объединяет слово перед Smith и дает «JohnSmith», «MarySmith»…

Небольшое руководство очень поможет.

Комментарии:

1. Используйте .* для сопоставления с чем-либо ранее Smith .

2. Ваше регулярное выражение соответствует только пробелам перед Smith .

3. child['full_name'].str.split(' ').str[-1] ?

Ответ №1:

Используйте

 >>> df = pd.DataFrame({'full_name':["Mary Smith", "Rose Smith", "Lisa Blaid"]})
df['full_name'].replace({r'S s Smith':'Smith'},regex=True, inplace = True)
 

Out:

 >>> dr
    full_name
0       Smith
1       Smith
2  Lisa Blaid
>>> 
 

Объяснение выражения

 --------------------------------------------------------------------------------
  S                       non-whitespace (all but n, r, t, f,
                           and " ") (1 or more times (matching the
                           most amount possible))
--------------------------------------------------------------------------------
  s                       whitespace (n, r, t, f, and " ") (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  Smith                    'Smith'
 

Комментарии:

1. Привет, Рышард, это частично работает; но это не работает с именами, длина которых превышает 2. Например, Эдвард Ларки Смит возвращается как Эдвард Смит.

2. @Yoko Затем используйте r'.*s Smith'

3. @Yoko, пожалуйста, также любезно поддержите ответ.