我正在尝试建立一个网络,其中我的边缘由元组组成。我试图对所有相关元素进行分组,但仅基于元组中的单个元素。
类似于:Grouping all connected nodes of a dataset
注意:熊猫23.4
给出以下数据框:
col1 col2 col1Name col2Name
'A' 'B' '12345' '78911'
'C' 'B' '12345' '78911'
'J' 'K' '12345' '12345'
'E' 'D' '12345' '12345'
我将col1和col1Name合并为一个元组,并使用col2 / col2Name进行同样的操作。
col1 col2
('A','12345') ('B','78911')
('C','12345') ('B','78911')
('J','12345') ('K','12345')
('E','12345') ('D','12345')
('X','99999') ('B','99999')
我试图从这里查找所有“相关”信息,但不是有关元组的第二个元素的信息,而是第一个。
因此,如果我要对信息进行分组,它将类似于以下内容:
col1 col2
('A','12345') ('B','78911')
('C','12345') ('B','78911')
col1 col2
('J','12345') ('K','12345')
col1 col2
('E','12345') ('D','12345')
col1 col2
('X','99999') ('B','99999')
请注意,分组均未考虑col1Name / col2Name。该信息仅存在以使col1 / col2中的元素更具“唯一性”。还值得一提的是,可以有多个A,B,C等。在我的示例中,('B','78911')
与('B','99999')
我的想法(来自参考链接):
G.add_edges_from(df.values.tolist())
cc = list(nx.connected_components(G))
component = next(i for i in cc if ('A') in i)
test = df[df.isin(component).all(1)]
这将返回与“ A”相关的所有分组,还返回与“ 12345”,“ 78911”相关的分组。我只是试图在第一个元素上分组。
答案 0 :(得分:0)
您写道:
请注意,分组至今都没有考虑到col1Name / col2Name。
和:
但是,('B','99999')与('B','78911')不在同一组中
这是矛盾的。如果您“根本不考虑col1Name / col2Name”,它们有什么不同?数据框中也缺少“ X”。
那么您要分组在一起吗?您写道:
('X','99999')和('B','99999')分组在一起
但是那些只是同一行中的两个元组。在您撰写的第一篇文章中,您对所有行按col1中的相等值或col2中的相等值进行分组。那是什么df
中的数据看起来如何?我无法复制您的示例代码。
尝试更精确地解释您想要做什么。
考虑到我所矛盾和缺少的信息,请您尝试:“将在col1或col2中具有相等值的行组合在一起。”
如果仅以元组(如您所写的那样)获取数据,则会丢失行的信息,所以我认为这不是您的意思。
由于您描述的是一个具有边的网络,并且(如您所写的那样)您的col1Name
和col2Name
列在分组时将被忽略,因此必须为{{1} } 方法。看起来像这样:
connected_components()
networkX connected_component()方法将具有相等值的所有元组组合在一起。如果要使用此方法,则必须为其提供正确的数据。