考虑以下数据框:
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
1条答案
按热度按时间mmvthczy1#
您可以使用
nx.dfs_edges
输出:
要提取子图,请使用: