为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

料青山看我应如是 2023-09-12 17:29:43
我有两个数据框,一个有单词,另一个有文本。我想获取第一个数据框中包含该单词的所有行的计数。字=ID   | Word------------1    | Introduction2    | database3    | country 4    | search文字 =ID   | Text------------1    | Introduction to python2    | sql is a database3    | Introduction to python in our country4    | search for a python teacher in our country我想要的最终输出是ID   | Word  |  Count---------------------1    | Introduction  | 22    | database  | 13    | country  |  14    | 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'''
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

您可以尝试这个示例来加快速度:


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  c

0  Introduction  2

1      database  1

2       country  2

3        search  1



查看完整回答
反对 回复 2023-09-12
?
当年话下

TA贡献1890条经验 获得超9个赞

Series.str.splitSeries.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  Count

0  Introduction      2

1      database      1

2       country      2

3        search      1


查看完整回答
反对 回复 2023-09-12
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

这是简单的解决方案

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  count

ID                     

0   Introduction      2

1       database      1

2        country      2

3         search      1

'''

逐步解决方案:


# Convert column to list

words = Word['Word'].tolist()


# Get the count

count = [Text['Text'].str.contains(w).sum() for w in words]


world_count = pd.DataFrame(

    {'words': words,

     'count': count,

    }).rename_axis('ID')

提示:


我建议您转换为小写,这样您就不会因为大/小写而错过任何计数


import re

import pandas as pd


world_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')


查看完整回答
反对 回复 2023-09-12
  • 3 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信