[英]Renaming Anytree Parent and Child Name
我有一个数据集如下
唯一名称 | 家长 | 孩子 |
---|---|---|
美国_SQ | 一种 | A1 |
UC_LC | 一种 | A2 |
英国_SJ | A2 | A21 |
用户界面_QQ | 乙 | B1 |
现在我想设置 output 如下:
US_SQ
├── A1
└── UC_LC
└── UK_SJ
UI_QQ
└── B1
换句话说,我想使用树中的Unique name
列值。
这是我正在使用的代码:
def add_nodes(nodes, parent, child):
if parent not in nodes:
nodes[parent] = Node(parent)
if child not in nodes:
nodes[child] = Node(child)
nodes[child].parent = nodes[parent]
data = pd.DataFrame(columns=["Parent","Child"], data=[["US_SQ","A","A1"],["UC_LC","A","A2"],["UK_SJ","A2","A21"],["UI_QQ","B","B1"]])
nodes = {} # store references to created nodes
# data.apply(lambda x: add_nodes(nodes, x["Parent"], x["Child"]), axis=1) # 1-liner
for parent, child in zip(data["Parent"],data["Child"]):
add_nodes(nodes, parent, child)
roots = list(data[~data["Parent"].isin(data["Child"])]["Parent"].unique())
for root in roots: # you can skip this for roots[0], if there is no forest and just 1 tree
for pre, _, node in RenderTree(nodes[root]):
print("%s%s" % (pre, node.name))
另外,有没有一种方法可以有效地访问树数据/是否有任何格式来保存树数据,以便我们可以轻松地轻松找到父/子节点?
上面的数据和问题是从这里使用的:
Read data from a pandas DataFrame and create a tree using anytree in python
你的问题有两个部分。
1.重命名节点
关于通过使用Unique Name
作为Parent
name 的别名来重命名节点,上面对 aliasDict 的回答很好,但我们可以直接修改 DataFrame,而不更改您的代码。
我已经修改了你的 DataFrame 因为它似乎不能正常运行,而且你的代码示例没有清楚地表明Unique Name
在某些情况下是Parent
的别名。
data = pd.DataFrame(
columns=["Unique Name", "Parent", "Child"],
data=[
["US_SQ", "A", "A1"],
["US_SQ", "A", "A2"],
["UC_LC", "A2", "A21"],
["UI_QQ", "B", "B1"]
]
)
# Rename Parent and Child columns using aliasDict
aliasDict = dict(data[["Parent", "Unique Name"]].values)
data["Parent"] = data["Parent"].replace(aliasDict)
data["Child"] = data["Child"].replace(aliasDict)
# Your original code - unchanged
nodes = {}
for parent, child in zip(data["Parent"],data["Child"]):
add_nodes(nodes, parent, child)
2.出口到DataFrame
在第二部分中, anyTree
不提供与 pandas DataFrame 的集成。一个替代的bigtree Python package 为你做了这个开箱即用的。
整个代码示例可以这样实现,
import pandas as pd
from bigtree import dataframe_to_tree_by_relation, print_tree, tree_to_dataframe
data = pd.DataFrame(
columns=["Unique Name", "Parent", "Child"],
data=[
["root", "root", "A"], # added this line
["root", "root", "B"], # added this line
["US_SQ", "A", "A1"],
["US_SQ", "A", "A2"],
["UC_LC", "A2", "A21"],
["UI_QQ", "B", "B1"]
]
)
# Rename Parent and Child columns using aliasDict (same as above)
aliasDict = dict(data[["Parent", "Unique Name"]].values)
data["Parent"] = data["Parent"].replace(aliasDict)
data["Child"] = data["Child"].replace(aliasDict)
# Create a tree from dataframe, print the tree
root = dataframe_to_tree_by_relation(data, parent_col="Parent", child_col="Child")
print_tree(root)
# root
# ├── US_SQ
# │ ├── A1
# │ └── UC_LC
# │ └── A21
# └── UI_QQ
# └── B1
# Export tree to dataframe
tree_to_dataframe(root, parent_col="Parent", name_col="Child")
# path Child Parent
# 0 /root root None
# 1 /root/US_SQ US_SQ root
# 2 /root/US_SQ/A1 A1 US_SQ
# 3 /root/US_SQ/UC_LC UC_LC US_SQ
# 4 /root/US_SQ/UC_LC/A21 A21 UC_LC
# 5 /root/UI_QQ UI_QQ root
# 6 /root/UI_QQ/B1 B1 UI_QQ
资料来源:我是bigtree的创造者;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.