Как преобразовать dataframe в многослойный Json в Python?

1

У меня есть дата-схема, показанная ниже.

Supervisor-L3   Supervisor-L2   Supervisor-L1   Employee
    O               M                J            A
    O               M                J            B
    O               M                J            C
    O               M                K            D
    O               N                K            E
    O               N                K            F
    O               N                L            G
    O               N                L            H
    O               N                L            I

Я хочу преобразовать dataframe в json файл, чтобы создать организационную диаграмму. Однако, когда я использую функцию pandas.to_json. Выход:

 {"Supervisor-L3":{"0":"O","1":"O","2":"O","3":"O","4":"O","5":"O","6":"O","7":"O","8":"O"},"Supervisor-L2":{"0":"M","1":"M","2":"M","3":"M","4":"N","5":"N","6":"N","7":"N","8":"N"},"Supervisor-L1":{"0":"J","1":"J","2":"J","3":"K","4":"K","5":"K","6":"L","7":"L","8":"L"},"Name":{"0":"A","1":"B","2":"C","3":"D","4":"E","5":"F","6":"G","7":"H","8":"I"}}

Мне нужен файл json, который может описывать иерархические отношения между людьми в наборе данных. Кто-нибудь может мне помочь? Спасибо!

отношения

Теги:
pandas
dataframe
python-3.x

2 ответа

0

Я пересматриваю имя "Супервизор-L3" на "Супервизор", "Супервизор-L2" на "Руководитель группы" и "Супервизор-L1" на "Компания". Потому что одна компания может принадлежать нескольким лидерам команд. Следовательно, я пишу три цикла для получения json файла, который может описывать отношения.

a = {'name':'O',
 'Subordinate':[]}

##merge these columns to have a one-to-one mapping
df['merge'] = df['Team Leader']+','+df['Company']
df['merge2'] =  df['Team Leader']+','+df['Company'] +','+df['Name']


##get the list of unique elements
set1 = list(set(df['Supervisor']))
set2 = list(set(df['Team Leader']))
set3 = list(set(df['merge']))
set4 = list(set(df['merge2']))

## write the loop
for i in range(len(set2)):
    temp_dict1 = {'name':set2[i],
             'Subordinate':[]}
    a['Subordinate'].append(temp_dict1)
    m = -1
    for j in range(len(set3)):
        list1 = set3[j].split(",")
        if set2[i] == list1[0]:
            temp_dict2 = {'name':list1[1],
                 'Subordinate':[]}
            a['Subordinate'][i]['Subordinate'].append(temp_dict2)
            m += 1
            for k in range(len(set4)):
                list2 = set4[k].split(",")
                if (list1[0] == list2[0]) and (list1[1] == list2[1]):
                    temp_dict3 = {'name':list2[2]}
                    a['Subordinate'][i]['Subordinate'][m]['Subordinate'].append(temp_dict3)

Выход:

Out[86]: 
{'Subordinate': [{'Subordinate': [{'Subordinate': [{'name': 'F'},
      {'name': 'E'}],
     'name': 'K'},
    {'Subordinate': [{'name': 'I'}, {'name': 'H'}, {'name': 'G'}],
     'name': 'L'}],
   'name': 'N'},
  {'Subordinate': [{'Subordinate': [{'name': 'D'}], 'name': 'K'},
    {'Subordinate': [{'name': 'B'}, {'name': 'A'}, {'name': 'C'}],
     'name': 'J'}],
   'name': 'M'}],
 'name': 'O'}     
0

Вы можете использовать networkx или просто удлинить данные в data, dataframe.

data = pd.concat([pd.DataFrame(df.iloc[:,i:i+2].values, columns=['P','C']) for i in range(3)], ignore_index=True)

G = nx.from_pandas_edgelist(data, 'P','C')

from networkx.readwrite import json_graph

txtgraph = json_graph.node_link_data(G)

txtgraph

Выход:

{'directed': False,
 'graph': {},
 'links': [{'source': 'O', 'target': 'M'},
  {'source': 'O', 'target': 'N'},
  {'source': 'M', 'target': 'J'},
  {'source': 'M', 'target': 'K'},
  {'source': 'N', 'target': 'K'},
  {'source': 'N', 'target': 'L'},
  {'source': 'J', 'target': 'A'},
  {'source': 'J', 'target': 'B'},
  {'source': 'J', 'target': 'C'},
  {'source': 'K', 'target': 'D'},
  {'source': 'K', 'target': 'E'},
  {'source': 'K', 'target': 'F'},
  {'source': 'L', 'target': 'G'},
  {'source': 'L', 'target': 'H'},
  {'source': 'L', 'target': 'I'}],
 'multigraph': False,
 'nodes': [{'id': 'O'},
  {'id': 'M'},
  {'id': 'N'},
  {'id': 'J'},
  {'id': 'K'},
  {'id': 'L'},
  {'id': 'A'},
  {'id': 'B'},
  {'id': 'C'},
  {'id': 'D'},
  {'id': 'E'},
  {'id': 'F'},
  {'id': 'G'},
  {'id': 'H'},
  {'id': 'I'}]}
  • 0
    @ Скотт Бостон Спасибо. Однако в кадре данных один сотрудник может иметь несколько супервизоров. Например, у К есть два босса. И два сотрудника, принадлежащие к K, работают на M. Если я преобразую фрейм данных в крайний список. Я потеряю эту информацию. Подскажите, пожалуйста, как решить эту проблему? Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню