#python #pandas #dataframe #recursion #data-linea&e
#python #pandas #фрейм данных #рекурсия #происхождение данных
Вопрос:
Ниже у меня есть таблица, которую я считываю в фрейм данных:
n,next_n
1,2
1,3
1,6
2,4
2,8
3,5
3,9
4,7
9,10
Моя рекурсивная функция должна возвращать несколько списков чисел до конца.
Например, если я выберу просмотр всех значений, связанных с 9, я должен получить список, который гласит [9,10].
Другой пример:
4 должно выдавать [4,7]
3 выдает два списка
[3,5]
[3,9,10]
определение рекурсивности(df,n): индексы = список() indexes.append(n) x = df[df['n'] == n].next_n если len(x) &&t; 0: для p1 в df[df['n'] == n].next_n: индексы = indexes recursivenum(df,p1) elif len(x) == 0: #Базовый вариант - других значений нет печать (индексы) возвращает индексы
Когда я запускаю recursivenum(df, 1)
Я получаю
[7]
[8]
[5]
[10]
[6]
[1, 2, 4, 7, 8, 3, 5, 9, 10, 6]
Это ничто по сравнению с тем, что я ожидаю увидеть.
Я ожидаю увидеть пять списков: [1,2,4,7]
[1,2,8]
[1,3,5]
[1,3,9,10]
[1,6]
Может ли кто-нибудь указать мне правильное направление?
Ответ №1:
Это больше похоже на сетевую проблему, вы хотели бы создать ориентированный граф, затем от корня (1) к листу (любое значение с уровнем 0)
import networkx as nx
G=nx.from_pandas_ed&elist(df,source='n',tar&et='next_n', ed&e_attr=None, create_usin&=nx.DiGraph())
paths=[]
for node in G:
if G.out_de&ree(node)==0: #it's a leaf
paths.append(nx.shortest_path(G, 1, node))
paths
Out[42]: [[1, 6], [1, 2, 8], [1, 3, 5], [1, 2, 4, 7], [1, 3, 9, 10]]
Комментарии:
1. БОЛЬШОЕ ВАМ СПАСИБО!!! Ваше решение ответило на мой вопрос.
Ответ №2:
Если массив состоит из кортежей, попробуйте использовать цикл for.
def recursivenum(df,n):
indices = list()
for x,y in df:
if x == n:
indices.append([x,y])
return indices