Explode List, содержащий много словарей в Pandas dataframe - PullRequest
0 голосов
/ 25 января 2020

У меня есть набор данных, который выглядит следующим образом (в кадре данных):

**_id** **paper_title**   **references**                                                                  **full_text**
 1         XYZ              [{'abc':'something','def':'something'},{'def':'something'},...many others]       something
 2         XYZ              [{'abc':'something','def':'something'},{'def':'something'},...many others]       something
 3         XYZ              [{'abc':'something'},{'def':'something'},...many others]                         something

Ожидается:

**_id** **paper_title**   **abc**    **def**                               **full_text**
   1         XYZ          something  something                               something               
                          something  something
                          .    
                          .
                         (all the dic in list with respect to_id column)
   2         XYZ          something  something                               something               
                          something  something
                          .    
                          .
                         (all the dic in list with respect to_id column)

Я попытался df['column_name'].apply(pd.Series).apply(pd.Series) разделить список и словари на столбцы данных, но это не помогает, так как не разделяет словари.

Первая строка моего кадра данных: df.head (1)

Ответы [ 2 ]

1 голос
/ 26 января 2020

Предполагая, что ваш исходный DataFrame представляет собой список словарей с одной парой ключ: значение и ключом с именем 'reference':

print(df)                                                                                                                                
   id paper_title                                         references       full_text
0   1         xyz  [{'reference': 'description1'}, {'reference': ...       some text
1   2         xyz  [{'reference': 'descriptiona'}, {'reference': ...       more text
2   3         xyz  [{'reference': 'descriptioni'}, {'reference': ...  even more text

Тогда вы можете использовать concat для разделения ваши ссылки с их индексом:

df1 = pd.concat([pd.DataFrame(i) for i in df['references']], keys = df.index).reset_index(level=1,drop=True)
print(df1)                                                                                                                               
        reference
0    description1
0    description2
0    description3
1    descriptiona
1    descriptionb
1    descriptionc
2    descriptioni
2   descriptionii
2  descriptioniii

Затем используйте DataFrame.join, чтобы объединить столбцы вместе в их индексе:

df = df.drop('references', axis=1).join(df1).reset_index(drop=True)
print(df)                                                                                                                                
   id paper_title       full_text       reference
0   1         xyz       some text    description1
1   1         xyz       some text    description2
2   1         xyz       some text    description3
3   2         xyz       more text    descriptiona
4   2         xyz       more text    descriptionb
5   2         xyz       more text    descriptionc
6   3         xyz  even more text    descriptioni
7   3         xyz  even more text   descriptionii
8   3         xyz  even more text  descriptioniii
0 голосов
/ 26 января 2020

После большого прочтения документации pandas я обнаружил метод разнесения применение с apply (pd.Series) - самый простой из того, что я искал в вопрос.

Вот код:

df = df.explode('reference')

# Он разбивает списки на строки столбцов подмножества

df = df['reference'].apply(pd.Series).merge(df, left_index=True, right_index=True, how ='outer')

# разбивает список внутри ячейки Dataframe в строки и объединить их с исходным фреймом данных (AUB) в теории множеств

Sidenote: при объединении искать уникальные значения в столбце, так как будет много столбцов с дублированными значениями

Я надеюсь, что это поможет кому-то с фреймом данных / сериями со столбцами, имеющими список, содержащий несколько словарей, и хочет разделить список из нескольких словарей по ключу на новый столбец со значениями в качестве строк.

...