在python中通过3Million Records搜索子字符串

时间:2018-04-13 04:34:24

标签: python pandas

我有一个巨大的数据框架,其中有3M记录,其中包含名为description的列。我也有可能的子串设置大约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循环需要花费太多时间。

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

2 个答案:

答案 0 :(得分:0)

如果您使用pandas 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')

答案 1 :(得分:0)

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

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)

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