将多索引数据帧转换为嵌套字典

时间:2021-01-05 16:44:51

标签: python pandas dataframe data-science multi-index

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

我想将它转换成 nested dictionary,其中 'Dia' 是主键,里面包含另一个字典,其中键是 'mac_ap',值是另一个字典,其中键是将是 'download''upload' 并且值将是列 'bytes'

的对应值

像这样:

1 个答案:

答案 0 :(得分:0)

假设这是您的数据框:

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}}}