分组数据集的所有连接节点

时间:2019-06-20 12:40:13

标签: python pandas

这不是以下项目的重复项:

Fastest way to perform complex search on pandas dataframe

注意:熊猫版本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,但这是一个非常复杂的程序包。

1 个答案:

答案 0 :(得分:3)

您可以使用两列中的值作为边来定义图,然后寻找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