有效地在python中为NetworkX创建边缘

时间:2017-08-23 14:08:46

标签: python pandas numpy data-structures pyspark

我有一个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 个答案:

答案 0 :(得分:1)

我们将groupbycombinations中的itertools一起使用:

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)]