【发布时间】:2019-02-18 22:17:59
【问题描述】:
我有一个包含两列的数据框:Employee 和 Reports_to。每个员工都向某人报告,一直到首席执行官。我想把它转换成一个 json 文件,可以被可折叠的 d3 树使用(根据这个很棒的链接:d3 collapsible tree)。将制作一个出色的组织结构图,只需很少/无需手动操作即可保持最新。
我已经能够将 df 转换为正确的 json 格式,如下面的简单示例所示。但是,我在 Excel 中非常痛苦地执行此操作,然后将 .append 字符串复制并粘贴到 Jupyter (!) 中。 这是我的问题:在 Python3 中是否有一种优雅的方式将 2 列 df 转换为所需的字典?
import numpy as np
import pandas as pd
import json
#_Lx refers to the level in the organisation, where Jackie_L1 is the CEO
df = pd.DataFrame(np.array([
['Jo_L3','Jane_L2'],
['Jon_L3','Jane_L2'],
['James_L3','Jerry_L2'],
['Joan_L3','Jerry_L2'],
['Jane_L2','Jackie_L1'],
['Jerry_L2','Jackie_L1'],
['Jill_L2','Jackie_L1']]))
df.columns = ['Employee','Reports_to']
df
Employee Reports_to
Jo_L3 Jane_L2
Jon_L3 Jane_L2
James_L3 Jerry_L2
Joan_L3 Jerry_L2
Jane_L2 Jackie_L1
Jerry_L2 Jackie_L1
Jill_L2 Jackie_L1
#start with the root node and work over to the right (down the organisation) to provide the required json:
tree = {'parent': 'null', 'name': 'Jackie_L1', 'edge_name': 'Jackie_L1', 'children': []}
tree['children'].append({'parent': 'Jackie_L1', 'name': 'Jane_L2', 'edge_name': 'Jane_L2', 'children': []})
tree['children'].append({'parent': 'Jackie_L1', 'name': 'Jerry_L2', 'edge_name': 'Jerry_L2', 'children': []})
tree['children'].append({'parent': 'Jackie_L1', 'name': 'Jill_L2', 'edge_name': 'Jill_L2', 'children': []})
tree['children'][0]['children'].append({'parent': 'Jane_L2', 'name': 'Jo_L3', 'edge_name': 'Jo_L3', 'children': []})
tree['children'][0]['children'].append({'parent': 'Jane_L2', 'name': 'Jon_L3', 'edge_name': 'Jon_L3', 'children': []})
tree['children'][1]['children'].append({'parent': 'Jerry_L2', 'name': 'James_L3', 'edge_name': 'James_L3', 'children': []})
tree['children'][1]['children'].append({'parent': 'Jerry_L2', 'name': 'Joan_L3', 'edge_name': 'Joan_L3', 'children': []})
这是 d3 树所需的结果字典:
{'parent': 'null',
'name': 'Jackie_L1',
'edge_name': 'Jackie_L1',
'children': [{'parent': 'Jackie_L1',
'name': 'Jane_L2',
'edge_name': 'Jane_L2',
'children': [{'parent': 'Jane_L2',
'name': 'Jo_L3',
'edge_name': 'Jo_L3',
'children': []},
{'parent': 'Jane_L2',
'name': 'Jon_L3',
'edge_name': 'Jon_L3',
'children': []}]},
{'parent': 'Jackie_L1',
'name': 'Jerry_L2',
'edge_name': 'Jerry_L2',
'children': [{'parent': 'Jerry_L2',
'name': 'James_L3',
'edge_name': 'James_L3',
'children': []},
{'parent': 'Jerry_L2',
'name': 'Joan_L3',
'edge_name': 'Joan_L3',
'children': []}]},
{'parent': 'Jackie_L1',
'name': 'Jill_L2',
'edge_name': 'Jill_L2',
'children': []}]}
我将tree 转换成这样的 json 文件:
with open('C:/Python37/input_graph_tree.json', 'w') as outfile:
json.dump(tree, outfile)
在桌面上运行可折叠树的说明在上面的链接中,尽管您需要使用python -m http.server 8080 来启动它,而不是python -m SimpleHTTPServer 8080。
【问题讨论】:
标签: json python-3.x dictionary tree