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

2022-08-10 12:42:09 发布

您现在位置:Python中文网/ 问答频道 /正文

这不是以下内容的副本:

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,但它是一个非常复杂的包。你知道吗


Tags: to数据信息元素列表副本performwaycol2col1fastestcol2moreinfocol1moreinfocol2infocol1info
1条回答
网友
1楼 ·

您可以使用两列中的值作为边来定义图形,并查找^{}。这里有一种使用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