简体   繁体   English

迭代不均匀列以找到现有值的最快方法

[英]fastest way to iterate through uneven columns to find the existing value

I have 2 DataFrames of (df1) 35k and (df2) 76k rows where I need to check whether df1["col1"] elements exist in df2["col2"] sub-elements.我有 2 个 (df1) 35k 和 (df2) 76k 行的 DataFrame,我需要检查df1["col1"]元素是否存在于df2["col2"]子元素中。 The code seems to be working fine on a sample dataset I have provided but the runtime takes forever on the original one.该代码似乎在我提供的示例数据集上运行良好,但运行时永远需要原始数据集。 Here is a for-loop code I used on the sample dataset:这是我在示例数据集上使用的 for 循环代码:

import pandas as pd

post_token_list = [['wXrL3TbK'], ['wXmTQKw1'], ['wXvnlWej'], ['wXvXBjKp']]
tokens_list = [['wXv3qoPQ', 'wXvT7ylu', 'wXvnIJuH', 'wXvXH7vy', 'wXvDXSS1', 'wXvjVE1F', 'wXvPV6z1', 'wXvHF1uw',
                'wXvH1q03', 'wXvnTlcr', 'wXvDEG9U', 'wXLfZtO6', 'wXvLDDDl', 'wXvHTgjk', 'wXvHDDr8', 'wXvPBLbu',
                'wXvvxXHI', 'wXvPBFge', 'wXvLxSii', 'wXvDhk2h', 'wXv3Alan', 'wXvvQuKy', 'wXvvQ6LO', 'wXpHNjw9'],
               ['wXYr2lVk', 'wXXj7iDP', 'wXXXIsQr', 'wXQbXKz6', 'wXN3tMp1', 'wXMfZV5N', 'wXvnlWej', 'wXSDyEaW',
                'wXQ7mM78', 'wXMPvojh', 'wXMjo-8G', 'wXLfZtO6', 'wXN3tMp1'],
               ['wXr_jZmX', 'wXr7D0AM', 'wXrzjhxL', 'wXrfjQNe', 'wXrnihqT', 'wXrjyqm5', 'wXr3CD4h', 'wXrnSZsy',
                'wXrTieP7', 'wXLfZtO6', 'wXgHVwkc', 'wXdvewsV', 'wXrfxZeg', 'wXrLB7Zo', 'wXprtX71', 'wXrHhjtO',
                'wXrzwKBt', 'wXqz-RlY', 'wXq_fp7F', 'wXq7Po7n', 'wXq7fC73', 'wXqzvRSW', 'wXqf_PQ3', 'wXML2vCd'],
               ['wXv3aQrv', 'wXvn6ONM', 'wXvfaG0M', 'wXvf6LIr', 'wXvjJBg_', 'wXvL6M-0', 'wXv7p2cd', 'wXv3poSs',
                'wXvz5kUz', 'wXvrZz0_', 'wXv_YVCb', 'wXLfZtO6', 'wXvX5Hgi', 'wXvz3Ptg', 'wXvHJUU-', 'wXvr4fB7',
                'wXvnlWej', 'wXv_YUrK', 'wXv7Id05', 'wXv7IYOV', 'wXvfYfLo', 'wXv7Y3AV', 'wXvT4_pE', 'wXvPovRt'],
               ['wXoDui-2', 'wXoT9yTg', 'wXmTQKw1', 'wXormLxu', 'wXMX-NNQ', 'wXo7kUfB', 'wXon0rt_', 'wXozT-3V',
                'wXnvYjEc', 'wXnTn9D6', 'wXnLH7Cz', 'wXn_2HV_', 'wXnPGou9', 'wXnPVSNo', 'wXuG0sl3', 'wXnjAs7X',
                'wXm38mLv', 'wXmnj5Oh', 'wXmfjQ2h', 'wXm_wXuD', 'wXlPOUmy', 'wXcfHkmx', 'wXQ_62cx', 'wXUD3qyx']]

df1 = pd.DataFrame({"col1": post_token_list})
df2 = pd.DataFrame({"col2": tokens_list})

query_bounce = []

def query_bounce_checker(dataset_clicked, dataset_loaded, col1, col2):
    for i in dataset_clicked[col1]:
        for j in i:
            [query_bounce.append(k) for k in dataset_loaded[col2] if j in k]
    return query_bounce


query_bounce_checker(df1, df2, "col1", "col2")

i , j , and k values are used to access and compare the elements and sub-elements of the two respecting columns. ijk值用于访问和比较两个相关列的元素和子元素。 Speed is a contributing factor for me, and the function written here is not fast enough for a dataset of this size.速度对我来说是一个影响因素,这里写的 function 对于这种大小的数据集来说不够快。

I am not sure if it is what you want.我不确定这是否是你想要的。 If you just want to check which values in df1 also exist in df2, you can transform two dataframes into arrays and use np.in1d() to do so.如果您只想检查 df1 中的哪些值也存在于 df2 中,您可以将两个数据帧转换为 arrays 并使用np.in1d()来执行此操作。

Try this:尝试这个:

array1 = np.array((','.join(df1['col1'].apply(lambda x: ','.join(x)))).split(','))
array2 = np.array((','.join(df2['col2'].apply(lambda x: ','.join(x)))).split(','))
print(array1[np.in1d(array1,array2)])

Output: Output:

['wXmTQKw1' 'wXvnlWej']

If this is actually what you want, this should be pretty fast.如果这实际上是您想要的,那应该很快。

import numpy as np

np.intersect1d(np.hstack(df1.col1),np.hstack(df2.col2))

Output Output

array(['wXmTQKw1', 'wXvnlWej'], dtype='<U8')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM