首页 > 解决方案 > 用 Pandas 或 Pyspark 用两列表示的关系展平“树”

问题描述

我收集了类似于以下格式的家谱:

    A
   / \
  B   C
 / \ / \
D  E F  G
  / \
 .. ..

在以下两列(包含多棵树)中表示:

孩子 父母
一个
一个
C 一个
D
... ...

将其展平以便在新列中获得最高父级的最有效方法是什么?

即B = A,D = A ...?

孩子 父母 最高父
一个 一个
一个 一个
C 一个 一个
D 一个
... ... ...

理想情况下,我想在 Spark 中执行此操作(鉴于数据集的大小),但也可以尝试 Pandas?

如果每个级别没有一些非常密集的递归函数,我目前无法有效地完成这项工作(即使我的树最多有 3 级深)。

标签: pythonpandaspyspark

解决方案


在熊猫中,您可以检查networkx

df=df.dropna()
import networkx as nx
G=nx.from_pandas_edgelist(df, 'parent', 'child',create_using=nx.DiGraph())
def find_root(G,node):
    if len(list(G.predecessors(node)))>0:
        root = find_root(G,list(G.predecessors(node))[0])
    else:
        root = node
    return root

df['child'].apply(lambda x : find_root(G,x))

Out[109]: 
1    A
2    A
3    A

推荐阅读