如何高效利用Pandas行值对另一DataFrame执行str.count统计?
高效实现统计词汇在df_new中出现次数的方法
你当前的for循环方法虽能实现需求,但数据量较大时效率偏低。可以通过先统计df_new的词频,再与final做关联的方式实现无循环的高效计算,具体方案如下:
核心思路
- 对df_new的
Job列执行与final相同的拆分、展开操作,统计每个词汇的出现次数 - 将统计结果与final做左连接,直接匹配每个词汇在df_new中的出现次数,未匹配到的词汇补0
代码实现
import pandas as pd import re # 原构造final和df_new的代码保持不变 data = ['mechanical@engineer plays with machines','field engineer works with oil pumps','lab_scientist trains a rat that plays the banjo','doctor kills patients', 'computer-engineer creates killing AI','scientist/engineer publishes nothing'] df = pd.DataFrame(data, columns=['Job']) final = df['Job'].str.split().explode().value_counts().reset_index() final.columns = ['words', 'number'] new_data = ['mechanical@engineer plays with machines while learning mechanics','field engineer works with oil pumps and gas cylinders','lab_scientist trains a rat', 'doctor kills all','computer-engineer creates a conscious AI','scientist/engineer publishes something'] df_new = pd.DataFrame(new_data, columns=['Job']) # 高效统计并关联的核心代码 # 1. 生成df_new的词汇频次表 df_new_word_counts = df_new['Job'].str.split().explode().value_counts().reset_index() df_new_word_counts.columns = ['words', 'new_col'] # 2. 与final左连接,补全缺失值为0 final = final.merge(df_new_word_counts, on='words', how='left').fillna(0) # 转成整数类型(可选,匹配频次的整数属性) final['new_col'] = final['new_col'].astype(int) print(final.head())
原代码的错误修正
你当前的循环代码里存在一处逻辑错误:foo = df.Job.str.count(keyword_pattern).sum() 应该使用df_new.Job而非df.Job,否则统计的是原df中的词汇次数,而非目标df_new的。
效率优势说明
这种方法利用pandas的向量化操作与合并能力,避免了逐行循环的开销。在数据量较大时(比如上万条Job记录),底层基于C实现的批量处理速度会远高于Python层面的逐行循环。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

