交叉路口 - 蟒蛇

时间:2018-04-20 18:47:03

标签: python python-2.7 pandas dataframe

我需要在数千个主叫号码之间找到交叉点(目的地号码),即我有以下数据框:

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 ..

请帮助我优化代码吗?感谢

1 个答案:

答案 0 :(得分:0)

得到答案:使用矩阵。

首先在SRC和DST之间进行交叉制表,然后将其转换为二进制矩阵。然后我们进行转置,然后将它们相乘。

对角线表示每个SRC调用的DST编号的唯一编号,非对角线表示两个SRC之间的DST编号