我有一个巨大的数据框,其中包含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)
现在,在搜索描述时,必须对搜索字符串应用相同的标记化,并将使用字典获取该特定单词的索引的交集,并且仅搜索这些字段。这大大减少了我运行程序所花费的总时间。