Извлечение слов из текстового столбца с форматированием фрейма данных - PullRequest
5 голосов
/ 28 мая 2020

Мне нужно создать новый столбец из другого. Набор данных создается с помощью этого кода (я извлек только несколько строк):

import pandas as pd

new_dataframe = pd.DataFrame({
    "Name": ['John', 'Lukas', 'Bridget', 'Carol','Madison'],
    "Notes": ["__ years old. NA", "__ years old. NA", 
        "__ years old. NA", "__ years old. Old account.", 
        "__ years old. New VIP account."], 
    "Status": [True, False, True, True, True]})

, который генерирует следующие

Name        Notes                           Status
John     23 years old. NA                    True
Lukas    52 years old. NA                    False
Bridget  64 years old. NA                    True
Carol    31 years old. Old account           True
Madison  54 years old. New VIP account.      True

Мне нужно создать два новых столбца, которые содержат информацию о возрасте в формат:

  1. __ лет (три слова): например, 23 года;
  2. __ (только числа): например, 23

В end У меня должно быть

Name        Notes                           Status          L_Age           S_Age
    John     23 years old. NA                    True      23 years old       23
    Lukas    52 years old. NA                    False     52 years old       52
    Bridget  64 years old. NA                    True      64 years old       64
    Carol    31 years old. Old account           True      31 years old       31
    Madison  54 years old. New VIP account.      True      54 years old       54

Я не знаю, как извлечь первые три слова, а затем только первое, чтобы создать новые столбцы. Я пробовал использовать

new_dataframe.loc[new_dataframe.Notes == '', 'L_Age'] = new_dataframe.Notes.str.split()[:3]
new_dataframe.loc[new_dataframe.Notes == '', 'S_Age'] = new_dataframe.Notes.str.split()[0]

, но это неверно (ValueError: Must have equal len keys and value when setting with an iterable).

Помощь будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 28 мая 2020

Вы можете использовать этот шаблон для извлечения информации и объединения:

pattern = '^(?P<L_Age>(?P<S_Age>\d+) years? old)'

new_dataframe = new_dataframe.join(new_dataframe.Notes.str.extract(pattern))

Вывод:

      Name                           Notes  Status         L_Age S_Age
0     John                23 years old. NA    True  23 years old    23
1    Lukas                52 years old. NA   False  52 years old    52
2  Bridget                64 years old. NA    True  64 years old    64
3    Carol       31 years old. Old account    True  31 years old    31
4  Madison  54 years old. New VIP account.    True  54 years old    54
2 голосов
/ 28 мая 2020

IIU C:

def get_first_n_words(txt, n):
    l = txt.split(' ')
    assert(len(l)>=n)
    return ' '.join(l[:n])

new_dataframe['L_Age'] = new_dataframe['Notes'].apply(lambda x: get_first_n_words(x, 3))
new_dataframe['S_Age'] = new_dataframe['Notes'].apply(lambda x: get_first_n_words(x, 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...