在 python 中有效地为 NetworkX 创建边
Posted
技术标签:
【中文标题】在 python 中有效地为 NetworkX 创建边【英文标题】:Creating edges for NetworkX in python efficiently 【发布时间】:2017-08-23 14:08:46 【问题描述】:我有一个 pandas 数据框,它具有一个人的唯一身份和姓氏。我想在所有姓氏相同的人之间划清界限。如何有效地做到这一点?
样本数据集:
Identity,LastName
1,Beckham
2,Singh
3,Bagari
4,Shukla
5,Sharma
6,Singh
7,Beckham
8,Beckham
9,Singh
输出: (1,7) , (1,8) , (7,8) , (2,6) , (2,9) , (6,9)
我想建立一个网络,其中身份 (1,7) , (1,8) , (7,8) , (2,6) , (2,9) , (6,9 )
我可以遍历所有身份,然后创建边,但是对于 5,000,000 条奇数记录需要很长时间?有没有更好的解决方案?
【问题讨论】:
您的预期结果是什么?列表、数据框、元组? 预期输出可以是一个元组或连接在一起的身份列表。对于上面的示例,它将类似于: (1,7) , (2,6) 你可以有两个以上姓氏相同的人吗?你想要两个人的所有组合吗? 是的,我们可以有超过 2 个姓氏相同的人,我想要两者的所有可能组合。我在想我可以创建一个字典,其中键作为姓氏,值作为身份,但是我将如何从那里创建一个元组? 您将需要构建一个更健壮的测试用例。 【参考方案1】:让我们将groupby
与来自itertools
的combinations
一起使用:
from itertools import combinations
s = df.groupby('LastName')['Identity'].agg(lambda x: tuple(x.tolist()))
s[s.apply(len)>1].apply(lambda x: list(combinations(x, 2))).sum()
输出:
[(1, 7), (1, 8), (7, 8), (2, 6), (2, 9), (6, 9)]
更新:
from itertools import combinations, chain
list(chain(*df.groupby('LastName')['Identity'].agg(tuple).apply(combinations, r=2)))
输出:
[(1, 7), (1, 8), (7, 8), (2, 6), (2, 9), (6, 9)]
【讨论】:
嗨 Scott,感谢您的回复,此代码生成与 last name 关联的所有身份的列表,因此我得到如下输出:Beckham (1,7,14,15,17, 21) 。我想要所有可能的组合:像 (1,7) (1,14) (1,15)(1,17) (1,21) (7,14) (7,15) (7,17) (7, 21) 等等.... 嗨 Scott,这需要花费大量时间来为 5,000,000 条记录创建元组,我有什么办法可以在 python 中并行运行它(可能是使用 pyspark)?或者我可以更快地生成组合的其他方式? 让我们得到一些 numpy 的帮助。将 numpy 添加到问题中的标签中。或者使用 numpy 标签创建一个新问题。以上是关于在 python 中有效地为 NetworkX 创建边的主要内容,如果未能解决你的问题,请参考以下文章