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)