fuzzywuzzy模糊匹配和提取

fuzzywuzzy简单用法

fuzzywuzzy 使用Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大

fuzzywuzzy的process模块可以比较两组(个)数据,并输出比对分数

如下面的脚本即是比对自己的一组数据和参考的一组数据,并得出比对结果,比如我这里使用基因

#!/usr/bin/env python3

import pandas as pd
from fuzzywuzzy import process

# 假设有一个小的基因名称列表,可能是你关注的几个基因
my_genes = pd.DataFrame({
    'My_Gene_Name': ['BRCA1', 'TP53', 'EGFR', 'XYZ']
})

# 假设有一个基因数据库的DataFrame
db_genes = pd.DataFrame({
    'Database_Gene_Name': ['BRAC1', 'T53', 'EGRF', 'MTHFRR', 'AOP3', 'BRCA1', 'TP5', 'EGFR', 'MTHFR', 'APOE']
})

# 创建一个空的DataFrame用于存储最佳匹配结果
df_best_matches = pd.DataFrame(columns=['My_Gene_Name', 'Best_Match', 'Score'])
df_no_match = pd.DataFrame(columns=['My_Gene_Name', 'Best_Match', 'Score'])

# 遍历我关注的每一个基因名称
for my_gene in my_genes['My_Gene_Name']:
    # 使用fuzzywuzzy找到最佳匹配的基因名称
    best_match, score = process.extractOne(my_gene, db_genes['Database_Gene_Name'])[0:2]
    
    # 创建一个临时的DataFrame来存储这一行数据
    temp_df = pd.DataFrame({
        'My_Gene_Name': [my_gene],
        'Best_Match': [best_match],
        'Score': [score]
    })
    
    # 判断是否有足够好的匹配(这里假设得分必须大于85)
    if score > 85:
        df_best_matches = pd.concat([df_best_matches, temp_df], ignore_index=True)
    else:
        df_no_match = pd.concat([df_no_match, temp_df], ignore_index=True)

# 将没有匹配的基因添加到底部
df_final = pd.concat([df_best_matches, df_no_match], ignore_index=True)

# 打印输出
print(df_final)

结果如下

╰─[~ ❤ ▶ ./test.py
  My_Gene_Name Best_Match Score
0        BRCA1      BRCA1   100
1         TP53        T53    86
2         EGFR       EGFR   100
3          XYZ      BRAC1     0
  • 发表于 2023-09-05 16:29
  • 阅读 ( 501 )
  • 分类:python

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
xun
xun

电路元件工程师

68 篇文章

作家榜 »

  1. omicsgene 658 文章
  2. 安生水 328 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. 红橙子 78 文章
  6. CORNERSTONE 72 文章
  7. xun 68 文章
  8. rzx 67 文章