在python中通过300万条记录搜索子字符串



我有一个巨大的数据框,其中包含3M条记录,其中有称为描述的列。此外,我也有大约 5k 的子字符串集。

我想获取描述中包含任何子字符串的行。

我使用了以下循环

for i in range(0,len(searchstring)): 
 ss=searchsting[i]
 for k in range(0,len(df)):
    desc=df['description'].iloc[k].lower()
    if (bool(re.search(ss,desc))):
        trans.append(df.iloc[k])

问题是它花费了太多时间,因为搜索 5k 乘以 3M 循环。

有没有更好的方法来搜索子字符串?

如果使用熊猫isin()函数应该更快

例:

import pandas as pd
a ='Hello world'
ss = a.split(" ")
df = pd.DataFrame({'col1': ['Hello', 'asd', 'asdasd', 'world']})
df.loc[df['col1'].isin(ss)].index

返回索引列表:

Int64Index([0, 3], dtype='int64')

我找到了另一种方法。我通过拆分每个单词为 3M 数据集的描述列创建了一个单词字典。(我已将描述中的数字替换为零,并将其用于字典生成(

def tokenize(desc):
   desc=re.sub('d', '0', desc)
   tokens=re.split('s+',desc)
   return tokens
def make_inv_index(df):
  inv_index={}
  for i,tokens in df['description_removed_numbers'].iteritems():
     for token in tokens:
         try:
              inv_index[token].append(i)
         except KeyError:
              inv_index[token]=[i]
  return inv_index
df['description_removed_numbers']=df['description'].apply(tokenize)
inv_index_df=make_inv_index(df)

现在,在搜索描述时,必须对搜索字符串应用相同的标记化,并将使用字典获取该特定单词的索引的交集,并且仅搜索这些字段。这大大减少了我运行程序所花费的总时间。

相关内容

  • 没有找到相关文章

最新更新