【问题标题】:Python pandas how to optimizes comparing rows of a dataframe?Python pandas 如何优化比较数据框的行?
【发布时间】:2015-07-25 00:27:57
【问题描述】:

我有一个包含 169361 行的大型数据框,我想成对比较所有行的行。 我的数据框:

new_org         old_org                 asn     cc
85736 pcizzi    85736 - Pcizzi S .a     23201   PY
001             001 Host                40244   US
001             001 IT Complex          55734   IN
001 hospedagem  001 Hospedagem Ltda     36351   US
001web          action.us.001web.net    36351   US

在我的代码中,我正在成对比较“new_org”和“asn”列的内容,如果它们相同,我会放置一个“匹配”标签 my code:.

matching_dic = []    
tuples = [tuple(x) for x in df_compare.values]
# tuples

for i in range(len(tuples)):
    for j in range(i+1, len(tuples)):
        if tuples[i][1]!=tuples[j][1]:
            compare = str(tuples[i][0]) + '|' + str(tuples[j][0])
            originals_asn = str(tuples[i][2]) + '|' + str(tuples[j][2])
            originals_cc = str(tuples[i][3]) + '|' + str(tuples[j][3])
            if tuples[i][0]==tuples[j][0]:
                if tuples[i][2]==tuples[j][2]:
                    first_tag = 'match'
                    matching_dic.append({'originals_asn':originals_asn,'originals_cc':originals_cc, 'compare': compare, 'first_tag': first_tag})

dftest = DataFrame(matching_dic) 

这里是Expected result

compare              first_tag  originals_asn   originals_cc    
001 hospedagem|001web   match   3595|3595         US|US 

它现在可以完美地用于 1000 行作为测试,但整个数据集需要很长时间。有人知道更有效的方法吗?

【问题讨论】:

  • 作为一个想法,我将数据集按asn 分组,然后为所有超过一行的组创建输出
  • 当然需要很长时间;有 143 亿种可能的成对组合。
  • 我尝试了与@RomanPekar 不同的方法,但这似乎是一个不错的建议。

标签: python for-loop optimization pandas


【解决方案1】:

有点小技巧,但我认为它应该比你目前正在做的要快一点(一种找出方法)。我复制了一行以更好地检查它是否可以正常工作(因此您可以在下面看到第 0 行和第 2 行以及第 4 和第 5 行匹配):

          new_org               old_org    asn  cc
0    85736 pcizzi   85736 - Pcizzi S .a  23201  PY
1             001              001 Host  40244  US
2      85736 blah       85736 - whatevs  23201  PY
3             001        001 IT Complex  55734  IN
4  001 hospedagem   001 Hospedagem Ltda  36351  US
5          001web  action.us.001web.net  36351  US

无论如何,如果这是一种有用的方法(并且足够快),它肯定可以进一步清理。

org, asn, cc = [], [], []

for i in range(1,len(df)):
    df2 = df.iloc[i:].reset_index(drop=True)
    df3 = df.iloc[:-i]
    mask = df2.asn == df3.asn
        if any(mask):
        org.append( [ df2.new_org[mask].values[0], df3.new_org[mask].values[0] ] )
        asn.append(   df2.asn[mask].values[0] )
        cc.append(    df2.cc[mask].values[0] )

matches = pd.concat( [pd.DataFrame(org, columns=['org1','org2']),
                      pd.DataFrame(asn, columns=['asn']),
                      pd.DataFrame(cc,  columns=['cc']),], axis=1 )

matches

         org1            org2    asn  cc
0      001web  001 hospedagem  36351  US
1  85736 blah    85736 pcizzi  23201  PY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多