python – Pandas:改进运行时循环字符串包含子字符串

我得到了一个Pandas数据框,其中包含一个包含很长字符串的列(比如说URL_paths)和一个唯一子字符串列表(引用列表).对于我的数据框中的每一行,我想确定列表中的相应引用元素.因此,如果给定行中的URL是例如abcd1234,并且其中一个引用值是cd123,那么我想添加cd123作为对我的数据帧的引用,以对该行/ URL进行分类.

我让我的代码工作(见下面的例子),但由于for循环(我猜)它很慢,我无法摆脱它.我觉得我的代码可以更快,但却想不到改进它的方法.

如何改善运行时间?

见下面的工作示例:

import string
import secrets
import pandas as pd
import time
from random import randint

n_ref = 100
n_target = 1000000

## Build reference Series, and target dataframe
reference = pd.Series(''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(randint(10, 19))) 
                      for _ in range(n_ref))

target = pd.Series(reference.sample(n = n_target, replace = True)).reset_index().iloc[:,1]

dfTarget = pd.DataFrame({
        'target' : target,
        'pre-string' : pd.Series(''.join(secrets.choice(string.ascii_uppercase + string.digits) 
                                    for _ in range(randint(1, 10))) 
                                    for _ in range(n_target)),
        'post-string' : pd.Series(''.join(secrets.choice(string.ascii_uppercase + string.digits) 
                                    for _ in range(randint(1, 10))) 
                                    for _ in range(n_target)),
        'reference' : pd.Series()})

dfTarget['target_combined'] = dfTarget[['pre-string', 'target', 'post-string']].apply(lambda x: ''.join(x), axis=1)

## Fill in reference column
## Loop over references and return reference in reference column

start_time = time.time()
for x in reference:
    dfTarget.loc[dfTarget['target_combined'].str.contains(x) == True, 'reference'] = x
print("--- %s seconds ---" % (time.time() - start_time))

出:42.60 ……秒

最佳答案
在我的机器上,我看到使用pd.Series.apply提高了17倍:

reference_set = set(reference)

def calculator(x):
    return next((i for i in reference_set if i in x), None)

dfTarget['reference'] = dfTarget['target_combined'].apply(calculator)

但为了获得最佳性能,请参阅@unutbu’s solution.

转载注明原文:python – Pandas:改进运行时循环字符串包含子字符串 - 代码日志