Python - 在两个 DataFrame 列之间查找所有匹配字符串 - 序列项 0:预期的 str 实例,找到的元组

Python - Findall matching string(s) between two DataFrame columns - sequence item 0: expected str instance, tuple found

我正在尝试比较两个 DataFrame 列中的字符串。 category_df['column_text_to_find'] 包含要在其他数据帧 df2['column_text_to_search'] 中匹配的字符串。 新列 df2['matched text'] 应该 return 在 df2['column_text_to_search'] 中找到的 df['column_text_to_find']。 我的预期结果是

      ['column_text_to_search']   ['column_text_to_find']     ['matched text']
   'SP * GRAPHICSDIRECT.ascdadv'     'GRAPHICSDIRECT'          'GRAPHICSDIRECT'
   '99 CENTS ONLY #777#'             '99 CENTS ONLY'           '99 CENTS ONLY'
   'PAYPAL *BESTBUY COM  #3422#'     'BESTBUY'                 'BESTBUY'

  

不幸的是,我的代码 return 出错了。

csv 导入:

for f in all_files:
    df = pd.read_csv(f, sep=',',header=[3])
df2 = df

删除空格:

df2['column_text_to_search']=df2['column_text_to_search'].str.strip()

搜索和匹配文本:

 ch = category_df['column_text_to_find']
 pat = r'\b({0})\b'.format('|'.join(ch))
 df2['matched text'] = df2['column_text_to_search'].str.findall(pat, flags = 
 re.IGNORECASE).map("_".join)
 df2.head()

错误:

TypeError: sequence item 0: expected str instance, tuple found

如果我理解你的问题陈述,这里是解决你问题的代码

df2[match_text]=''
for j in range(len(df2)):
    for i in range(len(category_df)):
        if df2.column_text_to_search[j] in category_df.column_text_to_find[i]:
            df2.match_text[j]=df2.column_text_to_search[j]
            break

您可以使用

pattern = r'(?i)\b({0})\b'.format("|".join(df["column_text_to_find"].to_list()))
df["column_text_to_search"].str.findall(pattern).str.join('_')

或者,如果您要查找的“词”可以在字符串中的任何位置包含特殊字符:

pattern = r'(?i)(?!\B\w)({0})(?<!\w\B)'.format("|".join( sorted(map(re.escape, df["column_text_to_find"].to_list()), key=len, reverse=True) ))
df["column_text_to_search"].str.findall(pattern).str.join('_')

注意使用

  • (?i) - 它启用不区分大小写的搜索
  • \b...\b - 词边界允许全词搜索自然语言词(如果“wors”可以在任意位置包含特殊字符,则不能依赖词边界)
  • (?!\B\w) / (?<!\w\B) - 如果要查找的单词中的相邻字符是单词 char
  • ,则仅需要单词边界
  • "|".join(df["column_text_to_find"].to_list()) - 在 column_text_to_find 列中形成基于交替的值模式。
  • sorted(map(re.escape, df["column_text_to_find"].to_list()), key=len, reverse=True) - 按长度降序排列要查找的单词,并将它们转义以用于正则表达式
  • .findall(pattern) - 查找所有出现的模式和
  • .str.join('_') - 加入 _