如何从CSV文件中移除匹配度达80%的相似行?
如何从CSV文件中移除相似度达80%的重复行?
要实现这个需求,你可以借助字符串相似度算法(比如编辑距离、余弦相似度)结合CSV处理工具来完成。下面以Python为例,给出具体的实现方案:
核心工具选择
rapidfuzz:快速计算字符串相似度的库(比fuzzywuzzy性能更优),可直接返回两个字符串的匹配百分比。pandas:高效处理CSV文件的工具,方便读取、遍历和保存数据。
实现步骤与代码
1. 安装依赖库
先安装所需工具:
pip install pandas rapidfuzz
2. 完整处理代码
import pandas as pd from rapidfuzz import fuzz def remove_similar_rows(csv_path, output_path, threshold=80): # 读取CSV文件,示例数据为空格分隔,实际根据你的CSV分隔符调整 df = pd.read_csv(csv_path, sep='\s+', engine='python') # 初始化保留列表,先加入标题行 kept_rows = [df.iloc[0].tolist()] # 从第二行开始遍历处理 for idx in range(1, len(df)): current_row = df.iloc[idx] current_text = current_row['StructureData'] keep_flag = True # 和已保留的行(跳过标题)逐一比较相似度 for row in kept_rows[1:]: existing_text = row[1] # 转小写后计算匹配度,避免大小写干扰 similarity = fuzz.ratio(current_text.lower(), existing_text.lower()) if similarity >= threshold: keep_flag = False break if keep_flag: kept_rows.append(current_row.tolist()) # 转换为DataFrame并保存结果 result_df = pd.DataFrame(kept_rows, columns=df.columns) result_df.to_csv(output_path, index=False, sep='\t') # 替换为你的输入输出文件路径后调用 remove_similar_rows('input.csv', 'output.csv', threshold=80)
代码说明
- 相似度计算:用
fuzz.ratio将字符串转为小写后计算匹配度,消除大小写差异对结果的影响。 - 保留逻辑:仅保留与已保留行相似度低于80%的行,每组高相似度行中只保留第一个出现的条目(和你提供的示例输出逻辑一致)。
- 分隔符适配:示例输入为空格分隔的表格,实际使用时请根据你的CSV真实分隔符(如逗号
,)调整pd.read_csv的sep参数。
效果验证
针对你提供的输入数据,运行代码后会得到与示例一致的输出:D80A-fructofuranosidase系列仅保留5O47行,E298Q-BETA-GALACTOSIDASE系列仅保留5IFT行,其余高相似度行均被过滤。
内容的提问来源于stack exchange,提问作者user3765252
相关产品推荐
相关产品推荐

