Conversión de Anytree a Pandas o tupla con miembros del nodo como índices.
Me gustaría construir un pandas dataframe o una tupla a partir de un objeto anytree, donde cada nodo tenga un atributo de lista de miembros:
from anytree import Node, RenderTree, find_by_attr
from anytree.exporter import DictExporter
from collections import OrderedDict
import pandas as pd
import numpy as np
tree = Node('T0C0',
n=1000,
tier=0,
members=['A','B','C','D'])
Node('T0C0.T1C0',
parent=find_by_attr(tree, 'T0C0'),
n=400,
tier=1,
members=['B','C'])
Node('T0C0.T1C1',
parent=find_by_attr(tree, 'T0C0'),
n=600,
tier=1,
members=['A','D'])
Node('T0C0.T1C1.T2C0',
parent=find_by_attr(tree, 'T0C0.T1C1'),
n=300,
tier=2,
members=['D'])
Node('T0C0.T1C1.T2C1',
parent=find_by_attr(tree, 'T0C0.T1C1'),
n=300,
tier=2,
members=['A'])
Mi objetivo es producir un dataframe de nodos finales por miembro, o aún mejor, la pertenencia a la capa por columna, como sigue:
pd.DataFrame(data=np.array([['T0C0.T1C1.T2C1','T0C0.T1C0','T0C0.T1C0','T0C0.T1C1.T2C0'],
['T0C0','T0C0','T0C0','T0C0'],
['T0C0.T1C1','T0C0.T1C0','T0C0.T1C0','T0C0.T1C1'],
['T0C0.T1C1.T2C1',None,None,'T0C0.T1C1.T2C0']]
),
index=['A','B','C','D'],columns=['EndCluster','tier0','tier1','tier2'])
He intentado exportar a ordereddict y a json y construir dataframes directamente desde allí, pero “children” se convierte en una columna en el dataframe resultante, con entradas de ordereddict. No puedo encontrar una forma de desanidar. ¡Gracias por cualquier ayuda!
davy.ai
Para generar el dataframe deseado, se pueden seguir los siguientes pasos:
traverse_tree()
.Convertir el diccionario en un dataframe de pandas, donde las columnas representen los diferentes niveles y los miembros sean filas, utilizando
pd.DataFrame.from_dict()
. En este dataframe, los valores en cada columna serán un diccionario con las llaves como nombres de los miembros y los valores como rutas correspondientes a las hojas del árbol.Usar
pd.DataFrame.transpose()
para intercambiar filas y columnas, y luego aplanar los diccionarios anidados para obtener el dataframe final.Esto producirá el siguiente dataframe: