如何匹配替换文件列内容及转换String-db的Ensembl蛋白ID为HGNC基因符号
嘿,这两个问题本质都是批量匹配替换的场景——一个是通用表格处理,另一个是生物信息学里常见的ID映射,我给你准备了两种实用的解决办法,不管你习惯用Python还是命令行都能搞定!
1. 通用表格匹配替换(文件1列1/2匹配文件2列1,替换为文件2列2)
方法一:用Python Pandas(适合熟悉编程、需要灵活处理的场景)
pandas是处理表格数据的神器,几步就能完成匹配替换:
import pandas as pd # 读取文件,默认按csv处理;如果是制表符分隔的tsv,把sep改成'\t' file1 = pd.read_csv("file1.csv", sep=",") # 给文件2指定列名,方便后续调用(假设文件2无表头) file2 = pd.read_csv("file2.csv", sep=",", header=None, names=["match_id", "replace_val"]) # 把文件2的匹配关系转成字典,键是待匹配的ID,值是要替换的内容 replace_dict = dict(zip(file2["match_id"], file2["replace_val"])) # 对文件1的第1、2列做替换,没匹配到的内容保留原值(用fillna避免变成空值) # 如果文件1没有列名,用iloc[:,0]和iloc[:,1]指代第1、2列 file1["col1"] = file1["col1"].map(replace_dict).fillna(file1["col1"]) file1["col2"] = file1["col2"].map(replace_dict).fillna(file1["col2"]) # 保存处理后的结果 file1.to_csv("file1_replaced.csv", index=False, sep=",")
方法二:用命令行awk(适合快速处理大文件,无需编程环境)
如果你的文件很大,或者不想写代码,awk命令能直接在终端完成操作:
# 假设文件是制表符分隔的tsv,要改成csv的话把FS/OFS改成"," awk 'BEGIN{FS=OFS="\t"} NR==FNR{map[$1]=$2; next} {if($1 in map) $1=map[$1]; if($2 in map) $2=map[$2]}1' file2.txt file1.txt > file1_replaced.txt
简单解释下:
BEGIN{FS=OFS="\t"}:设置输入输出的分隔符为制表符NR==FNR:先处理第一个输入文件(file2),把第1列作为键、第2列作为值存进数组- 接着处理file1,检查第1、2列是否在映射数组里,在的话就替换,最后
1表示打印每一行
2. String-db Ensembl蛋白ID转HGNC基因符号
这是第一个问题的具体场景,只需要针对生物信息学数据的特点调整细节:
用Pandas的适配方案
import pandas as pd # 读取String-db的交互文件(String-db默认是tsv格式) string_db = pd.read_csv("string_interactions.tsv", sep="\t", header=0) # 读取BioMart下载的映射表,确保列名和你下载的表格对应(比如"Ensembl Protein ID"和"HGNC symbol") biomart_map = pd.read_csv("biomart_protein_to_hgnc.tsv", sep="\t") # 构建映射字典,如果有重复的Ensembl ID,保留第一个对应的HGNC符号 hgnc_dict = dict(zip(biomart_map["Ensembl Protein ID"], biomart_map["HGNC symbol"])) # 替换String-db的两列蛋白ID,没匹配到的保留原ID string_db["protein1"] = string_db["protein1"].map(hgnc_dict).fillna(string_db["protein1"]) string_db["protein2"] = string_db["protein2"].map(hgnc_dict).fillna(string_db["protein2"]) # 保存转换后的结果 string_db.to_csv("string_interactions_hgnc.tsv", sep="\t", index=False)
额外注意事项
- 如果BioMart的表格里一个Ensembl蛋白ID对应多个HGNC符号,先去重再处理:
biomart_map = biomart_map.drop_duplicates(subset="Ensembl Protein ID", keep="first") - 要是你想过滤掉没有匹配到HGNC符号的行,可以用:
string_db = string_db.dropna(subset=["protein1", "protein2"])
内容的提问来源于stack exchange,提问作者Rodrigo Arenas
相关产品推荐
相关产品推荐

