Фрейм данных Python pandas заполняет иерархические уровни от родителя к ребенку

#python #pandas #recursion

Вопрос:

У меня есть следующий фрейм данных, который содержит отношение Родитель-потомок:

 data = pd.DataFrame({'Parent':['a','a','b','c','c','f','q','z','k'],
                      Child':['b','c','d','f','g','h','k','q','w']})
a
├── b
│   └── d
└── c
    ├── f
    │   └── h
    └── g
z
└── q
    └── k
        └── w
 

Я хотел бы получить новый фрейм данных, который содержит, например, всех детей родителей a :

ребенок уровень 1 уровень 2 уровень x
d a b
b a
c a
f a c
h a c f
g a c

Я не знаю, сколько уровней впереди, поэтому я упомянул «уровень x».

Я предполагаю, что каким-то образом рекурсивные вещи должны повторяться по кадру данных.

Комментарии:

1. основываясь на строке кода, которую вы опубликовали со словарями для фрейма данных, как можно узнать, что 'd' это дочернее 'b' устройство ? Я вижу это на вашей диаграмме, но как данные, которые у вас есть или которые вводятся, показывают эту взаимосвязь? ах, nvm Я вижу это сейчас — первый родитель является родителем первого ребенка, второй родитель является родителем второго ребенка и т. Д. Итак, d-четвертый ребенок, и так же ребенок четвертого родителя

Ответ №1:

Я бы предложил

  • строительство каждого children:parentList
  • создайте DataFrame с присвоением level имени каждому родителю
 import pandas as pd

values = {'Parent': ['a', 'a', 'b', 'c', 'c', 'f', 'q', 'z', 'k'],
          'Child': ['b', 'c', 'd', 'f', 'g', 'h', 'k', 'q', 'w']}

relations = dict(zip(values['Child'], values['Parent']))

def get_parent_list(element):
    parent = relations.get(element)
    return get_parent_list(parent)   [parent] if parent else []

all_relations = {
    children: {f'level_{idx}': value for idx, value in enumerate(get_parent_list(children))}
    for children in set(values['Child'])
}

df = pd.DataFrame.from_dict(all_relations, orient='index')
print(df)


  level_0 level_1 level_2
b       a     NaN     NaN
f       a       c     NaN
d       a       b     NaN
g       a       c     NaN
h       a       c       f
q       z     NaN     NaN
k       z       q     NaN
w       z       q       k
c       a     NaN     NaN