将多索引数据框转换为嵌套字典
Converting a multindex dataframe to a nested dictionary
我有一个分组数据框,如下所示 link:
我想将它转换成 nested dictionary
,其中 'Dia'
是主键,里面包含另一个字典,其中键是 'mac_ap'
,值是另一个字典,其中键是 'download'
和 'upload'
,值是 'bytes'
列的对应值
像这样:
假设这是您的数据框:
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()
您首先在 'Dia'
上 groupby
,然后在嵌套的 'macap'
上应用另一个 groupby
。最后一个apply是用来把transmission和bytes做成tuple,然后转成dictionay。
由于你有 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}}}
我有一个分组数据框,如下所示 link:
我想将它转换成 nested dictionary
,其中 'Dia'
是主键,里面包含另一个字典,其中键是 'mac_ap'
,值是另一个字典,其中键是 'download'
和 'upload'
,值是 'bytes'
像这样:
假设这是您的数据框:
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()
您首先在 'Dia'
上 groupby
,然后在嵌套的 'macap'
上应用另一个 groupby
。最后一个apply是用来把transmission和bytes做成tuple,然后转成dictionay。
由于你有 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}}}