networkx如何处理2元组?

时间:2019-06-21 15:10:10

标签: python pandas networkx

我正在尝试建立一个网络,其中我的边缘由元组组成。我试图对所有相关元素进行分组,但仅基于元​​组中的单个元素。

类似于: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”相关的分组。我只是试图在第一个元素上分组。

1 个答案:

答案 0 :(得分:0)

您写道:

  

请注意,分组至今都没有考虑到col1Name / col2Name。

和:

  

但是,('B','99999')与('B','78911')不在同一组中

这是矛盾的。如果您“根本不考虑col1Name / col2Name”,它们有什么不同?数据框中也缺少“ X”。

那么您要分组在一起吗?您写道:

  

('X','99999')和('B','99999')分组在一起

但是那些只是同一行中的两个元组。在您撰写的第一篇文章中,您对所有行按col1中的相等值或col2中的相等值进行分组。那是什么df中的数据看起来如何?我无法复制您的示例代码。 尝试更精确地解释您想要做什么。

考虑到我所矛盾和缺少的信息,请您尝试:“将在col1或col2中具有相等值的行组合在一起。”

如果仅以元组(如您所写的那样)获取数据,则会丢失行的信息,所以我认为这不是您的意思。

由于您描述的是一个具有边的网络,并且(如您所写的那样)您的col1Namecol2Name列在分组时将被忽略,因此必须为{{1} } 方法。看起来像这样:

connected_components()

networkX connected_component()方法将具有相等值的所有元组组合在一起。如果要使用此方法,则必须为其提供正确的数据。