如何在pandas中优化递归函数调用和内部循环?

2024-04-24 05:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个数据帧中找到一个特定孩子的所有父母。我当前的代码需要20多秒来编译一个3000个数据点数据集。我想这是因为我使用的递归函数调用和循环。你能帮我优化一下程序吗?在

我试图搜索子节点的父节点,打印它并将其假定为子节点。然后递归地找到它的父对象,依此类推,直到完全找到所有父对象为止。在

df = pd.DataFrame(
    {
        'parent_name': 
    ["Car","Tyre","Tyre","Rubber","Nylon","Nylon","Trees","Trees"],
    'child_name': ["Tyre","Rubber","Nylon","Trees","Chemicals","Man-made","Leaves","Stems"]
    }
)

定义一个使用所有这些来查找所有父节点的函数

^{pr2}$

我将接收到的输出作为单独的列存储在数据帧上

在此之后,我只需在dataframe中搜索用户输入,并将相应的父列列表显示为输出

预期输出:

如果用户给出“树”作为输入

输出: 树木:橡胶,轮胎,汽车


Tags: 数据对象代码用户name程序df节点
1条回答
网友
1楼 · 发布于 2024-04-24 05:17:51

这里最自然的是使用树型数据结构,它将具有线性查询时间。虽然我很惊讶你的方法这么慢,因为3000个数据点并不庞大。在

import pandas as pd
from treelib import Tree

df = pd.DataFrame(
    {
        "parent_name":
            ["Car", "Tyre", "Tyre", "Rubber", "Nylon", "Nylon", "Trees", "Trees"],
        "child_name": ["Tyre", "Rubber", "Nylon", "Trees", "Chemicals", "Man-made", "Leaves", "Stems"]
    }
)

tree = Tree()
tree.create_node(df["parent_name"][0], df["parent_name"][0])  # root
for i, row in df.iterrows():
    tree.create_node(row["child_name"], row["child_name"], parent=row["parent_name"])
tree.show()

def find_parents(child_name):
    child = tree[child_name]
    parent_names = []
    while child.bpointer is not None:
        parent = tree[child.bpointer]
        parent_names.append(parent.identifier)
        child = parent

    return parent_names


print(find_parents("Trees"))
df["list_of_parents"] = df["child_name"].apply(find_parents)

注意:如果修改数据帧,则必须在再次调用“find_parents”函数之前重新创建树。如果您定期修改数据帧,您可以选择在find_parents函数中重新创建树。在

编辑:你好,阿克沙伊坎南,很抱歉迟来回复。因为有些节点可能有多个父节点,所以在这里使用的结构不是树而是有向无环图(DAG)。以下应该可以工作(我添加了一行(“Nylon”,“Leaves”)来测试多父实例)

^{pr2}$

相关问题 更多 >