разделить ячейку с многострочными данными на отдельные строки для каждого идентификатора панд - PullRequest
1 голос
/ 25 апреля 2019

У меня есть фрейм данных df с одним столбцом, содержащим многострочный текст:

df = pd.DataFrame({'ID': ['1','3', '3'], \
                   'code_description': ['N1.12 - some description - further details of the case\nR31 - customer not satisfied,  (case processed)', '"C3.42 - some description - further details of the case\nL91.29 - some description : case processed"','"O20.12 - some description - further details of the case\nZ30.00 - some description / case further details\nL20 - some description  "'], \
                   'postcode': ['1037', '2512','2512'], \
                   'age': ['34', '56','56']})

Я хочу разбить многострочные данные, хранящиеся в столбце code_description, и хотел бы получить только коды, такие как N1.12 или R31 и т. Д. И только один код на строку на ID.В то же время я хотел бы сохранить другие столбцы в кадре данных, но я не понимаю, как это получить.

Я пытался использовать метод str.split (), чтобы разделить разрывы строк, а затем использовать то же самое для разделения кода.Я сделал следующее:

df['code_description'].str.split("\n", expand=True).stack() и после этого использовал df['code_description'].str.split(" - ").str[0] для извлечения кодов.Но с этим методом я теряю информацию, связанную с ID и другими столбцами, такими как postcode и age.

В качестве вывода мне нужно следующее:

   ID code_description  postcode  age
0   1            N1.12      1037   34
1   1              R31      1037   34
2   3            C3.42      2512   56
3   3           L91.29      2512   56
4   3           O20.12      2512   56
5   3           Z30.00      2512   56
6   3              L20      2512   56

Есть ли какой-нибудь хороший способ получить такой вывод в Пандах?

1 Ответ

1 голос
/ 25 апреля 2019
sr = df.code_description.str.extractall(
    re.compile('(?P<extracted_code_description>[0-9A-Z\.]+)\s-\s'))

sr = sr.set_index(sr.index.droplevel(1))

result = pd.merge(left=df, right=sr, left_index=True, right_index=True, how='left')

print(result[['ID', 'extracted_code_description', 'postcode', 'age']])

вывод:

  ID extracted_code_description postcode age
0  1                      N1.12     1037  34
0  1                        R31     1037  34
1  3                      C3.42     2512  56
1  3                     L91.29     2512  56
2  3                     O20.12     2512  56
2  3                     Z30.00     2512  56
2  3                        L20     2512  56

вам может понадобиться усовершенствовать регулярное выражение, чтобы оно было универсально применимо ко ВСЕМ вашим случаям.

...