Я хотел бы создать 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')
.
Проверьте этот ответ: 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)