首页 > 解决方案 > 根据单独数据框中的单词匹配创建列 - 有效但速度很慢

问题描述

我有两个数据框:

df = 字符串列表:

字符串
文本 xxx 文本
文本 yyy 文本
文字 www 文字
文本eee文本
文本 xxx yyyy 文本

tag_matrix_df = 列、标签和搜索词的矩阵

搜索 标签
Col1 xxx 标签1
Col1 年年 标签2
Col2 万维网 标签3
Col2 eee 标签3
Col2 xxx yyyy 标签4

当在 df 的字符串中找到搜索词时,我需要根据 tag_matrix_df 向 df 添加列,例如: df =

Col1 Col2
文本 xxx 文本 标签1
文本 yyy 文本 标签2
文字 www 文字 标签3
文本eee文本 标签3
文本 xxx yyyy 文本 标签4

我有以下代码,它似乎工作正常,但速度很慢(tag_matrix_df > 5000 行)。

#df = Dataframe of words
#tag_matrix_df = datafreame of columns, labels and search strings
....

 def assign_label(kw, matrix_df):

    kw = kw.lower().strip()
    
    for ii, tag in matrix_df.iterrows():
      find_tag = tag['Find'].lower().strip()
      if kw != None and find_tag in kw.split():
        return tag['Label']

 flag_cols = tag_matrix_df['Flag Name'].unique()
 for flag in flag_cols:
   filtered_matrix_df = tag_matrix_df.loc[tag_matrix_df['Flag Name'] == flag]
   df[flag] = df.apply(lambda row: assign_label(row[0], filtered_matrix_df), axis=1)

另请注意 tag_matrix_df 的第一行和最后一行的问题,其中我们在“xxx yyyy”中有“xxx”。在这种情况下,它应该与 xxx yyyy 匹配,因为这是单词。

关于更智能地实现这一点的任何建议?

标签: pythonpandas

解决方案


使用pd.merge

df = pd.merge(df, tag_matrix_df, left_on='Words', right_on='Search', how='left') 
df = df.pivot(index='Words', columns='Columns', values='Labels').fillna('')
>>> df
Columns     Col1    Col2
Words
eee               label3
www               label3
xxx       label1
xxx yyyy          label4
yyy       label2

推荐阅读