#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