繁体   English   中英

重命名 Anytree 父子名称

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM