这不是以下项目的重复项:
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,但这是一个非常复杂的程序包。
答案 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