pandas如何将两个表格的相关列模糊匹配在一起

如下有两个表格,如果df_keyword表格中的keyword列中,某个值被df_sentence中的sentence列中某个值中包含的话,就把df_keyword表格中的keyid列的相应值匹配到df_sentence中的相应位置去,不知道表达清楚了吗
df_sentence = pd.DataFrame({
  "senid" : np.arange(10,17),
  "sentence" : [
      "怎样用pandas实现merge?",
      "Python之Numpy详细教程",
      "怎么使用Pandas批量拆分与合并Excel文件?",
      "怎样使用pandas的map和apply函数?",
      "深度学习之tensorflow简介",
      "tensorflow和numpy的关系",
      "基于sklearn的一些机器学习的代码"
  ]
})
df_keyword = pd.DataFrame({
  "keyid" : np.arange(5),
  "keyword" : ["numpy", "pandas", "matplotlib", "sklearn", "tensorflow"]
})

原先的位置直接挤掉还是怎么说?
暂时按照挤下去的计算


代码如下:

import pandas as pd
import numpy as np

df_sentence = pd.DataFrame({
    "senid": np.arange(10, 17),
    "sentence": [
        "怎样用pandas实现merge?",
        "Python之Numpy详细教程",
        "怎么使用Pandas批量拆分与合并Excel文件?",
        "怎样使用pandas的map和apply函数?",
        "深度学习之tensorflow简介",
        "tensorflow和numpy的关系",
        "基于sklearn的一些机器学习的代码"
    ]
})
df_keyword = pd.DataFrame({
    "keyid": np.arange(5),
    "keyword": ["numpy", "pandas", "matplotlib", "sklearn", "tensorflow"]
})

print(df_sentence)
for idx, row in df_sentence.iterrows():
    sentence = row['sentence']
    for _idx, _row in df_keyword.iterrows():
        if _row['keyword'].lower() in sentence.lower():
            row['sentence'] = _idx
            df_sentence.loc[idx, 'sentence'] = _idx

print("###############################################")
print(df_sentence)

输出为

  senid                   sentence
0     10          怎样用pandas实现merge?
1     11           Python之Numpy详细教程
2     12  怎么使用Pandas批量拆分与合并Excel文件?
3     13    怎样使用pandas的map和apply函数?
4     14          深度学习之tensorflow简介
5     15        tensorflow和numpy的关系
6     16        基于sklearn的一些机器学习的代码
###############################################
   senid sentence
0     10        1
1     11        0
2     12        1
3     13        1
4     14        4
5     15        4
6     16        3

如有问题及时沟通

一种方法是用正则表达式,首先用|将keyword合并起来,形成一个正则表达式字符串,然后用apply的方法进行匹配,最后用merge匹配识别到的id

此方法是两个表构建某一相同字段,然后全连接,在做匹配结果筛选,此方法针对数据量不大的时候,逻辑比较简单,但是内存消耗较大

  1. 导入库
    import pandas as pd
    import numpy as np
    import re

  2. 构建关键词
    #关键词数据
    df_keyword = pd.DataFrame({
    "keyid" : np.arange(5),
    "keyword" : ["numpy", "pandas", "matplotlib", "sklearn", "tensorflow"]
    })
    df_keyword
    Python Pandas两个表格内容模糊匹配的实现

  3. 构建句子
    df_sentence = pd.DataFrame({
    "senid" : np.arange(10,17),
    "sentence" : [
    "怎样用pandas实现merge?",
    "Python之Numpy详细教程",
    "怎么使用Pandas批量拆分与合并Excel文件?",
    "怎样使用pandas的map和apply函数?",
    "深度学习之tensorflow简介",
    "tensorflow和numpy的关系",
    "基于sklearn的一些机器学习的代码"
    ]
    })
    df_sentence
    Python Pandas两个表格内容模糊匹配的实现

  4. 建立统一索引
    df_keyword['match'] = 1
    df_sentence['match'] = 1

  5. 表连接
    df_merge = pd.merge(df_keyword, df_sentence)
    df_merge
    Python Pandas两个表格内容模糊匹配的实现

  6. 关键词匹配
    def match_func(row):
    return re.search(row["keyword"], row["sentence"], re.IGNORECASE) is not None
    df_merge[df_merge.apply(match_func, axis = 1)]


Python Pandas两个表格内容模糊匹配的实现

二、方法2
此方法对编程能力有要求,在大数据集上计算量较方法一小很多

  1. 构建字典
    key_word_dict = {
    row.keyword : row.keyid
    for row in df_keyword.itertuples()
    }
    key_word_dict
    {'numpy': 0, 'pandas': 1, 'matplotlib': 2, 'sklearn': 3, 'tensorflow': 4}

  2. 关键词匹配
    def merge_func(row):
    #新增一列,表示可以匹配的keyid
    row["keyids"] = [
    keyid
    for key_word, keyid in key_word_dict.items()
    if re.search(key_word, row["sentence"], re.IGNORECASE)
    ]
    return row
    df_merge = df_sentence.apply(merge_func, axis = 1)

  3. 结果展示
    df_merge
    Python Pandas两个表格内容模糊匹配的实现

  4. 匹配结果展开
    df_result = pd.merge(
    left = df_merge.explode("keyids"),
    right = df_keyword,
    left_on = "keyids",
    right_on = "keyid")
    df_result