【发布时间】:2018-07-28 06:03:22
【问题描述】:
我得到了一个 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... seconds
【问题讨论】:
标签: python pandas dataframe substring