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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!