У меня есть датафрейм с двумя столбцами: Employee и Reports_to.Каждый сотрудник подчиняется кому-то, вплоть до генерального директора.Я хотел бы преобразовать это в файл json, который может быть использован свертываемым деревом d3 (согласно этой замечательной ссылке: d3 свертываемое дерево ).Сделал бы для большой организационной диаграммы, которая может быть обновлена с небольшим / никаким ручным усилием.
![Collapsible org chart](https://i.stack.imgur.com/948uz.jpg)
Мне удалось преобразовать df в правильный формат json, как показано в простом примере ниже.Однако я сделал это очень болезненно в Excel, а затем скопировал и вставил .append
строки в Jupyter (!). Вот мой вопрос: существует ли в Python3 элегантный способ преобразования df с двумя столбцами в требуемый dict?
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': []})
Вот результирующий dict, требуемый деревом 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
.