python中的SQL递归

python中的SQL递归,python,python-3.x,pandas,recursion,Python,Python 3.x,Pandas,Recursion,我正在使用pandasread\u csv从2个csv读取数据 Details.csv ID,VALID P1,Yes P2,No P3,Yes P4,No 关系.csv ParentID,ChildID P1,C1 P1,C2 C1,C1A C2,C2A C1A,C1AA P2,D1 P2,D2 D2,D2A D2A,D2AA P3,C4 P4,C5 现在,我将两者存储在单独的数据帧中。我必须检查关系中的详细信息中的ID,并为每个ID查找其所有级别的子项(直到没有其他子项)。如果ID的有效

我正在使用pandas
read\u csv
从2个csv读取数据

Details.csv

ID,VALID
P1,Yes
P2,No
P3,Yes
P4,No
关系.csv

ParentID,ChildID
P1,C1
P1,C2
C1,C1A
C2,C2A
C1A,C1AA
P2,D1
P2,D2
D2,D2A
D2A,D2AA
P3,C4
P4,C5
现在,我将两者存储在单独的数据帧中。我必须检查
关系中的
详细信息
中的ID,并为每个
ID
查找其所有级别的子项(直到没有其他子项)。如果ID的有效列为
Yes
,则其所有子项都应为“VALID”,如果不是,则为“not VALID”

预期产量

P1,VALID
C1,VALID
C2,VALID
C1A,VALID
C2A,VALID
C1AA,VALID
P2,NOT VALID
D1,NOT VALID
D2,NOT VALID
D2A,NOT VALID
D2AA,NOT VALID
P3,VALID
C4,VALID
P4,NOT VALID
C5,NOT VALID
目前我正在用SQL做这件事。我不知道如何在python中复制它。pandas中是否有可用的功能,或者我必须使用
for
循环。如有任何建议,将不胜感激

从这一点上,我尝试了下面的方法,但它不起作用

import pandas as pd

details = pd.read_csv('C:/Myfolder/Python/Details.csv')
relationship = pd.read_csv('C:/Myfolder/Python/Relationship.csv')

def nlevel(details.id, parent_dict=relationship.ParentID, _cache={0:0}):
if details.id in _cache:
    return _cache[details.id]

return 1+nlevel(parent_dict[details.id],parent_dict)

可以使用堆栈递归地执行此操作。首先,将元素放入一个简化遍历的数组中,然后清空堆栈,为每个节点添加子节点,并将有效性字符串存储在单独的结构中。保留顺序,从有序节点有效性对构建结果数据帧,并转储到CSV

import pandas as pd
from collections import defaultdict

details_df = pd.read_csv("Details.csv")
relationship_df = pd.read_csv("Relationship.csv")
order = {k: 1 for k in relationship_df.values.flatten()}
graph = defaultdict(list)
validity = {}

for parent, child in relationship_df.values:
    graph[parent].append(child)

for root, valid in details_df.values:
    stack = [root]

    while stack:
        curr = stack.pop()
        validity[curr] = "VALID" if valid == "Yes" else "NOT VALID"
        stack.extend(graph[curr])

result_df = pd.DataFrame([[x, validity[x]] for x in order])
print(result_df.to_csv(index=False, header=False))
输出:

P1,有效
C1,有效
C2,有效
C1A,有效
C2A,有效
C1AA,有效
P2,无效
D1,无效
D2,无效
D2A,无效
D2AA,无效
P3,有效
C4,有效
P4,无效
C5,无效

relation.csv是否有序,我的意思是,同一个父对象的所有父子关系都在一个块中:例如,行P3、C4之后是否有P1、C3,因此P1、C3与另一个P1子关系不在同一块中?Hi@Ben.T。谢谢你抽出时间。不,没有订。它可以是任何顺序。也许在有人回答的同时看看这个,这解决了你的问题,而不是完全重复。非常感谢。我会尽快检查并接受答案。