Pandas DataFrame - словарь в строках в столбцы - PullRequest
1 голос
/ 06 февраля 2020

Источник DataFrame представляет собой список слов, таких как -
ls = [{'fileName': 'file_01', 'col1': {'key1': 'value1a', 'key2': 'value1b'}}, {'fileName': 'file_02', 'col1': {'key1': 'value2a', 'key2': 'value2b', 'key3':'value2c'}}, {'fileName': 'file_03', 'col1': {'key1': 'value3a', 'key3': 'value3c'}}]

DataFrame, созданный как
df = pd.DataFrame(ls, columns=['fileName', 'col1'])

Pandas DataFrame df выглядит как -

fileName     col1 
file_01      {'key1':value1a, 'key2':value1b}
file_02      {'key1':value2a, 'key2':value2b, 'key3':value2c}
file_03      {'key1':value3a, 'key3':value3c}

Как я могу преобразовать это, чтобы выглядеть так -

fileName     key1      key2      key3
file_01      value1a   value1b 
file_02      value2a   value2b   value2c
file_03      value3a             value3c

Я пытался -
df = pd.concat([df['fileName'], pd.get_dummies(df['col1'].apply(pd.Series))], axis=1)

Я вижу результаты в некоторых случаях, как -

fileName     key1_value1a     key1_value2a     key1_value3a
file_01      value1a           
file_02                       value2a   
file_03                                        value3a            

Ответы [ 3 ]

4 голосов
/ 06 февраля 2020

Использование pd.json_normalize():

In [40]: pd.concat([df['fileName'], pd.json_normalize(df['col1'])],axis=1)      
Out[40]: 
   fileName     key1     key2     key3
0   file_01  value1a  value1b      NaN
1   file_02  value2a  value2b  value2c
2   file_03  value3a      NaN  value3c
2 голосов
/ 06 февраля 2020

Можете ли вы попробовать следующее:

df1 = pd.concat([df[['fileName']], pd.DataFrame(df['col1'].to_list())], axis=1)

Выше будет работать, если {'key1':value1a, 'key2':value1b}, {'key1':value2a, 'key2':value2b, 'key3':value2c}, ... имеет тип dict

Это решение также будет работать, но решение предоставлено @Vorsprung выглядит красиво.

1 голос
/ 06 февраля 2020

Вы можете попробовать следующее решение:

df1 = pd.concat([df['fileName'], df['col1'].apply(pd.Series)], axis=1)

df['col1'].apply(pd.Series) разделить запрос на отдельные столбцы.

...