pandas 递归查找数据框中的连通组件

iyr7buue  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(138)

考虑以下数据框:

import numpy as np
import pandas as pd

df = pd.DataFrame(
    {
        "main": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        "component": [
            [1, 2],
            [np.nan],
            [3, 8],
            [np.nan],
            [1, 5, 6],
            [np.nan],
            [7],
            [np.nan],
            [9, 10],
            [np.nan],
            [np.nan],
        ],
    }
)

main列代表一种方法,每种方法由组件组成,组件本身也可以是一种方法,称为子方法。
我想找到某个方法的所有相关子方法/组件。
例如,假设我想找到主方法"0"的所有连接的子方法/组件,那么我想要的输出将如下所示:

target = pd.DataFrame({
    "main": [0, 0, 2, 2, 8, 8],
    "component": [1, 2, 3, 8, 9, 10]
})

理想情况下,我希望能够只选择方法,然后获得所有的子连接。我相信有一个聪明的方法来做到这一点使用networkx
最后,我想创建一个类似于下面的图(对于方法0):

    • 其他信息:**

您可以分解数据框,然后从main列中删除所有分量(分量是指没有任何分量的进近)。

df_exploded = df.explode(column="component").dropna(subset="component")

该图可按如下方式构建:

import networkx as nx
import graphviz

G = nx.Graph()
G.add_edges_from([(i, j) for i, j in target.values])

graph_attr = dict(rankdir="LR", nodesep="0.2")
g = graphviz.Digraph(graph_attr=graph_attr)

for k, v in G.nodes.items():
    g.node(str(k), shape="box", style="filled", height="0.35")

for n1, n2 in G.edges:
    g.edge(str(n2), str(n1))

g
mmvthczy

mmvthczy1#

您可以使用nx.dfs_edges

edges = df.explode(column='component').dropna(subset='component')

G = nx.from_pandas_edgelist(edges, source='main', target='component', create_using=nx.DiGraph)

target = pd.DataFrame(nx.dfs_edges(G, 0), columns=['main', 'component'])

输出:

>>> target
   main  component
0     0          1
1     0          2
2     2          3
3     2          8
4     8          9
5     8         10

要提取子图,请使用:

H = G.edge_subgraph(nx.dfs_edges(G, 0))

相关问题