首页 > 解决方案 > 对数据集的所有连接节点进行分组

问题描述

这不是以下内容的重复:

对 pandas 数据框执行复杂搜索的最快方法

注意:熊猫版本 0.23.4

假设:数据可以按任何顺序排列。

我有一个清单:

L = ['A', 'B', 'C', 'D', 'L', 'M', 'N', 'O']

我也有一个数据框。Col1 和 Col2 有几个相关的列,其中包含我希望保留的相关信息。信息是任意的,所以我没有填写。

Col1  Col2  Col1Info  Col2Info  Col1moreInfo  Col2moreInfo
 A     B       x         x            x             x
 B     C
 D     C
 L     M
 M     N
 N     O

我正在尝试为列表的每个元素执行“搜索和分组”。例如,如果我们对列表中的元素“D”执行搜索,则将返回以下组。

To    From  Col1Info  Col2Info  Col1moreInfo  Col2moreInfo
 A     B       x         x            x             x
 B     C
 D     C

我一直在玩networkx,但它是一个非常复杂的包。

标签: pythonpandas

解决方案


您可以使用两列中的值作为边来定义图形,并查找connected_components. 这是一种使用方法NetworkX

import networkx as nx

G=nx.Graph()
G.add_edges_from(df.values.tolist())
cc = list(nx.connected_components(G))
# [{'A', 'B', 'C', 'D'}, {'L', 'M', 'N', 'O'}]

现在说例如你想过滤D,你可以这样做:

component = next(i for i in cc if 'B' in i)
# {'A', 'B', 'C', 'D'}

并索引两列中的值所在的数据框component

df[df.isin(component).all(1)]

   Col1 Col2
0    A    B
1    B    C
2    D    C

通过生成数据框列表,可以将上述内容扩展到列表中的所有项目。然后我们只需要使用给定项目存在的位置进行索引L

L = ['A', 'B', 'C', 'D', 'L', 'M', 'N', 'O']

dfs = [df[df.isin(i).all(1)] for j in L for i in cc if j in i]
print(dfs[L.index('D')])

   Col1 Col2
0    A    B
1    B    C
2    D    C

print(dfs[L.index('L')])

   Col1 Col2
3    L    M
4    M    N
5    N    O

推荐阅读