我有一个巨大的数据框架,其中有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循环需要花费太多时间。
有没有更好的方法来搜索子字符串?
答案 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)
现在,在搜索描述时,必须在搜索字符串上应用相同的标记化,并且将使用字典获取该特定单词的索引交集,并且仅搜索那些字段。这大大减少了我运行程序的总时间。