猿问

在Python中获取两个数据帧之间包含子字符串的字符串行数的最快方法

我有两个数据框,一个有单词,另一个有文本。我想获取第一个数据框中包含该单词的所有行的计数。


字=


ID   | Word

------------

1    | Introduction

2    | database

3    | country 

4    | search

文字 =


ID   | Text

------------

1    | Introduction to python

2    | sql is a database

3    | Introduction to python in our country

4    | search for a python teacher in our country

我想要的最终输出是


ID   | Word  |  Count

---------------------

1    | Introduction  | 2

2    | database  | 1

3    | country  |  1

4    | search  |  2

我在单词 df 中有 200000 行,在文本中有 55000 行(每个文本的长度约为 2000 个单词)df。使用以下代码完成整个过程大约需要 76 小时


'''


def docCount(docdf, worddf):

    final_dict = {}

    for i in tqdm(worddf.itertuples()):

        docdf["Count"] = docdf.Text.str.contains(i[2])

        temp_dict = {i[2]: docdf.Count.sum()}

        final_dict = dict(Counter(final_dict)+Counter(temp_dict))

    return final_dict

'''


料青山看我应如是
浏览 117回答 3
3回答

SMILET

您可以尝试这个示例来加快速度:df1 = pd.DataFrame({'Word':['Introduction', 'database', 'country', 'search']})df2 = pd.DataFrame({'Text':['Introduction to python', 'sql is a database', 'Introduction to python in our country', 'search for a python teacher in our country']})tmp = pd.DataFrame(df2['Text'].str.split().explode()).set_index('Text').assign(c=1)tmp = tmp.groupby(tmp.index)['c'].sum()print( df1.merge(tmp, left_on='Word', right_on=tmp.index) )印刷:           Word  c0  Introduction  21      database  12       country  23        search  1

当年话下

Series.str.split与Series.explodefor 系列单词一起使用:s = df2['Text'].str.split().explode()#oldier pandas versions#s = df2['Text'].str.split(expand=True).stack()然后仅按Series.isin和过滤匹配的值boolean indexing,按Series.value_counts和 最后一次使用进行计数DataFrame.join:df1 = df1.join(s[s.isin(df1['Word'])].value_counts().rename('Count'), on='Word')print (df1)           Word  Count0  Introduction      21      database      12       country      23        search      1

慕勒3428872

这是简单的解决方案world_count = pd.DataFrame(    {'words': Word['Word'].tolist(),     'count': [Text['Text'].str.contains(w).sum() for w in words],    }).rename_axis('ID')输出:world_count.head()'''           words  countID                     0   Introduction      21       database      12        country      23         search      1'''逐步解决方案:# Convert column to listwords = Word['Word'].tolist()# Get the countcount = [Text['Text'].str.contains(w).sum() for w in words]world_count = pd.DataFrame(    {'words': words,     'count': count,    }).rename_axis('ID')提示:我建议您转换为小写,这样您就不会因为大/小写而错过任何计数import reimport pandas as pdworld_count = pd.DataFrame(    {'words': Word['Word'].str.lower().str.strip().tolist(),     'count': [Text['Text'].str.contains(w,flags=re.IGNORECASE, regex=True).sum() for w in words],    }).rename_axis('ID')
随时随地看视频慕课网APP

相关分类

Python
我要回答