从两列数据框(Python3)创建JSON层次树以实现d3可折叠树的可视化

时间:2019-02-18 22:17:59

标签: json python-3.x dictionary tree

我有一个包含两列的数据框:Employee和Reports_to。每位员工都向某人汇报,一直到CEO为止。我想将其转换为可由可折叠d3树使用的json文件(根据此重要链接:d3 collapsible tree)。可以制作出几乎不需要任何人工就可以保持最新状态的出色的组织结构图。

Collapsible org chart

我已经能够将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来使其生效。

1 个答案:

答案 0 :(得分:0)

感谢create tree的乔纳森·尤尼斯(Jonathan Eunice),我找到了一种方法。

<html>

<body>
  <form action="/somewhere" method="post" enctype="multipart/form-data">
    <input type="text" name="input">
    <input type="file" name="fileupload">
  </form>
</body>

</html>

...,然后按照说明按照OP在浏览器中显示d3树。这将为您提供OP中显示的树。如果树太大,这种情况就倒塌了,但是您可以一次创建一个主分支,最后将它们组合成一棵树(虽然不容易)。