Есть ли способ создания мульти-индексного фрейма данных из этого специального словаря c, который поддерживает целостность данных? - PullRequest
0 голосов
/ 29 января 2020

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

fdict = {}
fdict['apple'] = {}
fdict['banana'] = {}

fdict['apple']['green'] = 5
fdict['apple']['red'] = 3
fdict['banana']['light_yellow'] = 10
fdict['appraisal round'] = 1

fdict

{'apple': {'green': 5, 'red': 3},
 'banana': {'light_yellow': 10},
 'appraisal round': 1}

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

import numpy as np
import pandas as pd    

fruit_array = []
quality_array = []
values_array = []
for key in [key for key in fdict.keys() if key != 'appraisal round']:

    keys = fdict[key].keys()
    fr_array = np.repeat(key,len(keys))
    fruit_array.extend(fr_array)
    quality_array.extend(keys)
    val_array = fdict[key].values()
    values_array.extend(val_array)

columns_index = pd.MultiIndex.from_arrays([fruit_array,quality_array])
df = pd.DataFrame(data=np.reshape(values_array,(1,len(values_array))),columns=columns_index,index=[fdict['appraisal round']])

df

    apple       banana
    green   red light_yellow
1   5       3   10

У меня есть одна конкретная c проблема, связанная с этим методом, которая заключается в том, что (насколько я понимаю) словари специально не упорядочены (если вы не используете и не упорядочиваете слова, которые я предпочитаю не использовать здесь), и я вывожу данные в al oop в массивы, порядок которых важен для построения результирующего DataFrame. Мне нужен метод, который поддерживает целостность канала данных, не полагаясь на тот факт, что данные будут извлечены в правильном порядке.

Итак, есть ли предпочтительный метод, который явно поддерживает отношения ключ-пара значений в словаре при создании DataFrame из него? Кроме того, было бы замечательно меньше строк кода.

Спасибо!

1 Ответ

3 голосов
/ 29 января 2020

dict s поддерживает порядок вставки в python 3.6+. Но вместо того, чтобы беспокоиться об этом, лучше раскрутить словарь, чтобы он больше подходил для MultiIndex. MultiIndex просто имеет кортежи для ключей, поэтому мы можем создать это.

md = {(k1, k2) : v for k1,d in fdict.items() if k1 != 'appraisal round'
                   for k2,v in d.items()}

pd.DataFrame(md, index=[fdict['appraisal round']])
#  apple           banana
#  green red light_yellow
#1     5   3           10
...