构建 MultiIndex pandas DataFrame 嵌套 Python 字典

Posted

技术标签:

【中文标题】构建 MultiIndex pandas DataFrame 嵌套 Python 字典【英文标题】:Construct MultiIndex pandas DataFrame nested Python dictionary 【发布时间】:2019-07-26 08:01:15 【问题描述】:

我想从一个深度嵌套的字典构造一个 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”,并将字符串分别转换为intfloat

如何从数据框中重建我的原始字典? 我试过df.to_dict('list')

【问题讨论】:

【参考方案1】:

查看此答案:https://***.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 的数据类型更改为 intfloat,然后可以使用 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)

【讨论】:

如何从数据框中重建我的原始字典? @redhotsnow 我在答案中添加了重建技术。

以上是关于构建 MultiIndex pandas DataFrame 嵌套 Python 字典的主要内容,如果未能解决你的问题,请参考以下文章

如何从带有列表的嵌套字典构建 MultiIndex Pandas DataFrame

在 Pandas 中使用 .loc 和 MultiIndex

Pandas Dataframe 日期时间切片与 Index vs MultiIndex

将 dict 构造函数转换为 Pandas MultiIndex 数据帧

将 pandas 系列的 numpy 矩阵转换为 Multiindex 系列

Pandas 通过 Tuple 重命名 MultiIndex 的单行