首页 > 解决方案 > 将多索引数据框转换为嵌套字典

问题描述

我有一个分组数据框,如此链接所示:

我想将它转换为 a nested dictionary'Dia'主键在哪里,里面包含另一个字典,其中键是'mac_ap',值是另一个字典,键是'download''upload'值是列的对应值'bytes'

像这样的东西:

标签: pythonpandasdataframedata-sciencemulti-index

解决方案


假设这是您的数据框:

df = pd.DataFrame([['2010-12-06', 'MAC_AP_1', 'download', 1], 
                    ['2010-12-06', 'MAC_AP_1', 'upload', 2],
                    ['2010-12-06', 'MAC_AP_2', 'download', 3],
                    ['2010-12-06', 'MAC_AP_2', 'upload', 4], 
                    ['2020-01-01', 'MAC_AP_3', 'download', 5],
                    ['2020-01-01', 'MAC_AP_3', 'upload', 6],
                    ['2020-01-01', 'MAC_AP_4', 'download', 7],
                    ['2020-01-01', 'MAC_AP_4', 'upload', 8]]
                    , columns=['Dia', 'macap', 'transmission', 'bytes'])
    Dia         macap       transmission    bytes
0   2010-12-06  MAC_AP_1    download    1
1   2010-12-06  MAC_AP_1    upload  2
2   2010-12-06  MAC_AP_2    download    3
3   2010-12-06  MAC_AP_2    upload  4
4   2020-01-01  MAC_AP_3    download    5
5   2020-01-01  MAC_AP_3    upload  6
6   2020-01-01  MAC_AP_4    download    7
7   2020-01-01  MAC_AP_4    upload  

您需要从数据框中创建一个嵌套字典。因此,您应该递归地按数据框列分组,直到到达分支:

d = df.groupby('Dia').apply(lambda a: dict(a.groupby('macap').apply(lambda x: dict(zip(x['transmission'], x['bytes'])))))
d = d.to_dict()

您首先groupby'Dia'嵌套groupby'macap'. 最后一个 apply 用于使传输和字节成为一个元组,然后将它们转换为字典。

由于您有 3 级嵌套字典,因此您可以在代码中看到也有 3 次字典转换。

结果将是这样的:

{'2010-12-06': {'MAC_AP_1': {'download': 1, 'upload': 2}, 
                'MAC_AP_2': {'download': 3, 'upload': 4}}, 
'2020-01-01': {'MAC_AP_3': {'download': 5, 'upload': 6}, 
               'MAC_AP_4': {'download': 7, 'upload': 8}}}

推荐阅读