【问题标题】:SQL recursion in pythonpython中的SQL递归
【发布时间】:2020-12-02 09:05:09
【问题描述】:

我正在使用 pandas read_csv 从 2 个 csv 读取数据。

详细信息.csv

ID,VALID
P1,Yes
P2,No
P3,Yes
P4,No

Relations.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

现在我将两者都存储在单独的数据框中。我必须在Relationship 中检查来自Details 的ID,并为每个ID 找到其子级的所有级别(直到不再有子级)。如果 ID 的 VALID 列有 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 循环有关。任何建议将不胜感激。

从这个question,我尝试了类似下面的方法,但它不起作用。

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)

【问题讨论】:

  • relation.csv 是有序的吗,我的意思是一个块中同一父级的所有父子关系:例如,你可以在 P3,C4 行之后有 P1,C3,因此 P1,C3 与其他 P1-child 关系不在同一个块中?
  • 嗨@Ben.T。谢谢你的时间。不,它没有被订购。它可以是任何顺序。
  • 也许看看这个post同时有人回答,它解决了你的问题,而不是一个完整的重复

标签: python python-3.x pandas recursion


【解决方案1】:

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

【讨论】:

  • 非常感谢。我会尽快检查并接受答案。
猜你喜欢
  • 2013-09-21
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多