我需要在数千个主叫号码之间找到交叉点(目的地号码),即我有以下数据框:
Calling Number | Called Number | Seconds
023456738 | 9123457583 | 55
064785993 | 8804783937 | 125
087594937 | 9123457583 | 34
087594937 | 9278446356 | 33
023456738 | 6547485959 | 45
087594937 | 3547483946 | 23
例如,023456738已拨打2个号码,087594937已拨打3个号码,此号码9123457583是2个号码之间的共同号码:023456738和087594937.
我想要的输出是:
Calling Number1 | Calling Number2| Intersect Count | Intersect Value
023456738 | 087594937 | 1 | 9123457583
我做的是我在Calling Number中使用了唯一的(使用.unique()
),然后放入循环(i,j组合),然后检查i和j之间是否有公共数字。请参阅我的代码,merged2是上面的数据框。 SRC是主叫号码,DST是被叫号码。
#library
import pandas as pd
import itertools
merged2.sort_values('DST', inplace=True)
array_src = merged2.SRC.unique()
def intersect(lst1, lst2):
# Use of hybrid method
temp = set(lst2)
lst3 = [value for value in lst1 if value in temp]
return lst3
df = pd.DataFrame(columns['SRC1','SRC2','Intersect_count','Intersect_value'])
for i, j in itertools.product(array_src, array_src):
if i == j:
continue
dfA = merged2[(merged2['SRC'] == i)].copy()
array_Adst = dfA.DST.unique()
dfB = merged2[(merged2['SRC'] == j)].copy()
array_Bdst = dfB.DST.unique()
print i,j
if len(intersect(array_Adst,array_Bdst))>0:
print i,j
Intersect_count = len(intersect(array_Adst,array_Bdst))
Intersect_value = intersect(array_Adst,array_Bdst)
print Intersect
# add them to a dataframe
lister = [[i, j, Intersect_count,Intersect_value]]
dfi = pd.DataFrame(lister, columns=['SRC1', 'SRC2','Intersect_count','Intersect_value'])
df = df.append(dfi)
else:
continue
print df.head()
我得到的问题是,运行时间太长,好像我有10万个呼叫号码,它会为100,000C2的组合而做。例如,它将采用第一个数字023456738并检查064785993,087594937,023456738,然后检查编号064785993和087594937 ..
请帮助我优化代码吗?感谢
答案 0 :(得分:0)
得到答案:使用矩阵。
首先在SRC和DST之间进行交叉制表,然后将其转换为二进制矩阵。然后我们进行转置,然后将它们相乘。
对角线表示每个SRC调用的DST编号的唯一编号,非对角线表示两个SRC之间的DST编号