1

StackOverflow 上的第一个问题。无法找到此问题的其他实例,这使我相信我做错了什么。

我正在尝试根据物料清单 (BOM) 数据创建一棵树。首先,我只是想设置基本的父>子​​节点。

from anytree import Node, RenderTree, find_by_attr, NodeMixin
import pandas as pd

# Create Dataframe from csv file
df1 = pd.read_csv(r'filepath') # filepath only used for example


nodes = {} # Store created nodes

root = Node('root') # Setup root node

# Iterate over df and create parent/child nodes
for index, row in df1.iterrows():
    pitem = row['EBPART'].strip()  # get parent item number
    citem = row['EBCOMP'].strip() # get child item number
    nodes[pitem] = Node(pitem,parent=root) # create child node
    nodes[citem] = Node(citem,parent=pitem) # create parent node

基本上在迭代期间,我尝试创建父节点(不会引发错误),然后使用先前创建的节点作为父节点创建子节点。但是,我不断收到此错误:

anytree.node.exceptions.TreeError: Parent node 'Product1' is not of type 'NodeMixin'.

这是渲染树(根)的结果:

print(RenderTree(root))
Node('/root')
└── Node('/root/322601101')

这是我正在阅读的 csv 的简化版本:

示例 csv 结构

任何帮助是极大的赞赏!

4

2 回答 2

0

以下行看起来不错:

哪里node.name: strnode.parent: Node

nodes[pitem] = Node(pitem,parent=root) # create child node

这个不是:

nodes[citem] = Node(citem,parent=pitem)

这里node.name: strbut node.parent: str, and 应该是类型Node

另外设置node.parent = None, or not 是完全一样的。也是如此,它只是您可以为节点设置的附加属性,与**kwargs您面临的错误无关。

实际上,您需要先声明根节点,但是您正在这样做,错误不是因为那个

于 2020-10-08T23:16:24.373 回答
0

从this Github Issue看来您需要parent=None在根节点中显式设置。而且它似乎AnyNode期望**kwargs。(我没有阅读文档,所以我不能同意)因此您还应该修改您的pitemand citem.

于 2020-07-02T21:25:04.970 回答