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