0

我想从 anytree 对象构建一个 pandas 数据框或元组,其中每个节点都有一个成员列表属性:

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'])

我的目标是为每个成员生成一个端节点数据框,或者更好的是,为每列生成一个层级成员资格,如下所示:

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'])

我尝试导出到ordereddict和json并直接从那里构建数据框,但是“children”成为结果数据框中的一列,带有有序的dict条目。我找不到解除嵌套的方法。感谢您的任何帮助!

4

1 回答 1

0

答案比我想象的要容易。首先使用anytree的抓取所有端节点findall()

endnodes = anytree.findall(tree, filter_=lambda node: len(node.children)==0)  

这将返回一个节点列表,在这种情况下比 anytree 的 OrderedDict 转换更容易使用

最后,通过将成员级属性乘以来填充数据框len(member)

members = []
tier = []
endcluster = []
for item in endnodes:
    members += item.members
    tier += [item.tier] * len(item.members)
    endcluster += [item.name] * len(item.members)
endf = pd.DataFrame(index=members)
endf['tier']=tier
endf['endcluster']=endcluster
于 2021-12-30T11:45:49.080 回答