我想从形式最深的字典构造一个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')
在Construct pandas DataFrame from items in nested dictionary之后,但是我得到一个包含1行多列的DataFrame。
奖金:
我还想标记MultiIndex键和列'col1'和'col2',并将字符串分别转换为int
和float
。
如何从数据框中重建原始字典?
我尝试过df.to_dict('list')
。
答案 0 :(得分:3)
查看以下答案:https://stackoverflow.com/a/24988227/9404057。此方法解压缩字典的键和值,并将数据重新格式化为易于处理的多索引数据帧格式。请注意,如果您使用的是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)