Преобразование вложенного Dict в кадре данных? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытался разобрать вложенный dict во фрейме данных.Я сделал этот df из dict, но не смог выяснить этот вложенный.

df

    First   second    third              

 0     1       2      {nested dict}

nested dict:

   {'fourth': '4', 'fifth': '5', 'sixth': '6'}, {'fourth': '7', 'fifth': '8', 'sixth': '9'}

Мой желаемый вывод будет:

        First   second  fourth   fifth   sixth   fourth   fifth   sixth          

 0     1       2       4         5        6         7       8       9

Редактировать: оригинальный Dict

   'archi': [{'fourth': '115',
      'fifth': '-162',
      'sixth': '112'},
     {'fourth': '52',
      'fifth': '42',
      'sixth': ' 32'}]

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Подход "грубой силы"

import pandas as pd
import numpy as np

my_dict = {'Zero': 0, 'First': 1, 'Second': 2,
       'archi': [{'fourth': '115', 'fifth': '-162', 'sixth': '112'},
                {'fourth': '52', 'fifth': '42', 'sixth': ' 32'}]}

data_row=[]
columns = []
for key in my_dict.keys():
    try:
        if len(my_dict[key]):
            for item in my_dict[key]:
                # iterate over nested dicts
                for k, v in item.items():
                    columns.append(k)
                    data_row.append(v)

    except TypeError:
        data_row.append(my_dict[key])
        columns.append(key)

print(columns)
print(data_row)

data = np.array(data_row).reshape(1,9)
df = pd.DataFrame(new_d, columns=columns)
print(df)

Выход:

     Zero   First   Second   fourth     fifth   sixth   fourth  fifth   sixth
0       0       1        2      115      -162     112      52      42      32
0 голосов
/ 14 февраля 2019

Я создал функцию с использованием рекурсивного подхода для выравнивания структуры dict:

original_dict = {'Zero': 0, 'First': 1, 'Second': 2,
       'archi': [{'fourth': '115', 'fifth': '-162', 'sixth': '112'},
                {'fourth': '52', 'fifth': '42', 'sixth': ' 32'}]}

flattened_dict = {}

def flatten(obj, name = ''):
    if isinstance(obj, dict):
        for key, value in obj.items():
            flatten(obj[key], key)
    elif isinstance(obj, list):
        for e in obj:
            flatten(e)
    else:
        flattened_dict[name] = [obj] 

flatten(original_dict)

Затем создание кадра данных:

pd.DataFrame(flattened_dict)

Со следующим выводом:

enter image description here

0 голосов
/ 14 февраля 2019

Я не могу выйти, чтобы указать формат вложенного dict в «третьем» столбце, но вот что я рекомендую использовать Python: Pandas dataframe из Series of dict в качестве отправной точки.Вот код и данные, которые можно воспроизвести:

nst_dict = {'archi': [{'fourth': '115', 'fifth': '-162', 'sixth': '112'},
      {'fourth': '52', 'fifth': '42','sixth': ' 32'}]}

df = pd.DataFrame.from_dict({'First':[1,2], 'Second':[2,3], 
     'third': [nst_dict,nst_dict]})

Затем вам нужно сначала получить доступ к списку внутри дикта, затем к элементам списка:

df.thrd_1 = df.third.apply(lambda x: x['archi']) # convert to list
df.thrd_1a = df.thrd_1.apply(lambda x: x[0]) # access first item
df.thrd_1b = df.thrd_1.apply(lambda x: x[1]) # access second item

out = df.drop('third', axis=1).merge(
    df.thrd_1a.apply(pd.Series).merge(df.thrd_1a.apply(pd.Series),
    left_index=True, right_index=True),
    left_index=True, right_index=True)

print(out)

First  Second fourth_x fifth_x sixth_x fourth_y fifth_y sixth_y
0      1       2      115    -162     112      115    -162     112
1      2       3      115    -162     112      115    -162     112

Я попробуюочистить это с помощью collections.abc и превратить в функцию, но это должно помочь вашему конкретному случаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...