You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何匹配替换文件列内容及转换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:18:59