gpt4 book ai didi

python - Pandas:改进运行时间循环遍历包含子字符串的字符串

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:46 26 4
gpt4 key购买 nike

我有一个 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:改进运行时间循环遍历包含子字符串的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48841842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com