Создание MultiIndex панды DataFrame вложенный словарь Python

1

Я хотел бы создать MultiIndex DataFrame из глубоко вложенного словаря в форме

md = {'50': {'100': {'col1': ('0.100',
                              '0.200',
                              '0.300',
                              '0.400'),
                     'col2': ('6.263E-03',
                              '6.746E-03',
                              '7.266E-03',
                              '7.825E-03')},
             '101': {'col1': ('0.100',
                              '0.200',
                              '0.300',
                              '0.400'),
                     'col2': ('6.510E-03',
                              '7.011E-03',
                              '7.553E-03',
                              '8.134E-03')}
             '102': ...
            }
      '51': ...
     }

я пробовал

df = pd.DataFrame.from_dict({(i,j): md[i][j][v] for i in md.keys() for j in md[i].keys() for v in md[i][j]}, orient='index')

Следуя Построить панды DataFrame из элементов во вложенном словаре, но я получаю DataFrame с 1 строкой и многими столбцами.

Бонус: я также хотел бы обозначить ключи MultiIndex и столбцы 'col1' и 'col2', а также преобразовать строки в int и float соответственно.

Как я могу восстановить свой оригинальный словарь из кадра данных? Я пробовал df.to_dict('list').

Теги:
pandas
dataframe

1 ответ

3
Лучший ответ

Проверьте этот ответ: qaru.site/questions/277438/.... Этот метод распаковывает ключи и значения словаря и преобразует данные в легко обрабатываемый формат для мультииндексных фреймов данных. Обратите внимание, что если вы используете Python 3. 5+, вам нужно будет использовать .items() а не .iteritems() как показано в связанном ответе:

>>>>import pandas as pd
>>>>reform = {(firstKey, secondKey, thirdKey): values for firstKey, middleDict in md.items() for secondKey, innerdict in middleDict.items() for thirdKey, values in innerdict.items()}
>>>>df = pd.DataFrame(reform)

Чтобы изменить тип данных col1 и col на int и float, вы можете затем использовать pandas.DataFrame.rename() и указать любые значения, которые вы хотите:

df.rename({'col1':1, 'col2':2.5}, axis=1, level=2, inplace=True)

Кроме того, если вы предпочитаете иметь уровни в индексе, а не в столбцах, вы также можете использовать pandas.DataFrame.T

Если вы хотите восстановить свой словарь из этого MultiIndex, вы можете сделать что-то вроде этого:

>>>>md2={}
>>>>for i in df.columns:
        if i[0] not in md2.keys():
            md2[i[0]]={}
        if i[1] not in md2[i[0]].keys():
            md2[i[0]][i[1]]={}
    md2[i[0]][i[1]][i[2]]=tuple(df[i[0]][i[1]][i[2]].values)
  • 0
    Как я могу восстановить свой оригинальный словарь из кадра данных?
  • 0
    @redhotsnow Я добавил технику реконструкции в свой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню