Python 如何在熊猫中链接价值和找到群组

Python 如何在熊猫中链接价值和找到群组,python,pandas,Python,Pandas,我有一个来自熊猫的数据帧: import pandas as pd df = pd.DataFrame([{'element_from':'A', 'element_to':'B'}, {'element_from':'A', 'element_to':'C'}, {'element_from':'D','element_to':'C'}, {'element_from':'G

我有一个来自熊猫的
数据帧

import pandas as pd

df = pd.DataFrame([{'element_from':'A', 'element_to':'B'}, 
                   {'element_from':'A', 'element_to':'C'}, 
                   {'element_from':'D','element_to':'C'},
                   {'element_from':'G','element_to':'H'},
                   {'element_from':'H','element_to':'I'}])
print(df)
输出:

  element_from element_to
0            A          B
1            A          C
2            D          C
3            G          H
4            H          I
它表示不同元素之间的链接。由于中介,元素可以间接链接。例如,由于B,A和C连接在一起

换言之,我想确定一些元素组

结果可能是一个新的列,标识如下所示的组:

  element_from element_to group
0            A          B    G1
1            A          C    G1
2            D          C    G1
3            G          H    G2
4            H          I    G2
有没有一种简单的方法可以在熊猫身上实现这一点?
谢谢。

您可以使用
networkx

import networkx as nx

G = nx.Graph()
G.add_nodes_from(df.element_from.append(df.element_to).unique())
G.add_edges_from(df.to_records(False))

groups = list(nx.algorithms.components.connected_components(G))
df["group"] = [groups.index(group) for element in df.element_from for group in groups if element in group]
输出

  element_from element_to  group
0            A          B      0
1            A          C      0
2            D          C      0
3            G          H      1
4            H          I      1

要获得预期的输出,请添加以下行:

df["group"] = 'G' + (df["group"] + 1).astype(str)

  element_from element_to group
0            A          B    G1
1            A          C    G1
2            D          C    G1
3            G          H    G2
4            H          I    G2


查看networkx和连接的组件

import networkx as nx

# create graph from edge list
G = nx.from_pandas_edgelist(df, source='element_from', target='element_to')

# find connected components and label the nodes
to_map = {x: f'G{k}' for k,v in enumerate(nx.connected_components(G), 1) 
                     for x in v
         }
产出

  element_from element_to group
0            A          B    G1
1            A          C    G1
2            D          C    G1
3            G          H    G2
4            H          I    G2
df['group'] = df['element_from'].map(to_map)