如何用类似in操作符的方式合并含多蛋白ID的DataFrame?
解决Pandas DataFrame多蛋白ID匹配功能的方案
核心思路
把hit_df中用分号分隔的多蛋白ID拆分为单独行,再与database_df做匹配,最后按需合并结果,确保只要原始行中有一个蛋白能匹配到功能就保留对应信息。
示例代码与步骤
1. 导入库并构造测试数据
import pandas as pd # 模拟hit_df:包含单/多蛋白ID的数据集 hit_df = pd.DataFrame({ '原始行ID': [1, 2, 3], '蛋白ID集合': ['P01234;P56789', 'Q12345', 'R67890;S12345;T67890'] }) # 模拟database_df:存储已知蛋白及其功能 database_df = pd.DataFrame({ '蛋白ID': ['P56789', 'Q12345', 'S12345'], '功能描述': ['DNA聚合酶', '信号传导蛋白', '代谢酶'] })
2. 拆分多蛋白ID为单独行
将包含分号的蛋白ID列拆分为列表,再通过explode展开为多行,同时保留原始行的标识:
# 拆分并展开蛋白ID hit_expanded = hit_df.assign(蛋白ID=hit_df['蛋白ID集合'].str.split(';')).explode('蛋白ID')
3. 匹配蛋白功能
用左连接关联两个DataFrame,确保所有拆分后的蛋白ID都尝试匹配,未匹配到的功能会显示为NaN:
# 关联功能数据 merged_data = hit_expanded.merge(database_df, on='蛋白ID', how='left')
4. 生成最终结果
根据需求选择以下两种结果形式:
- 形式一:按原始行汇总匹配到的功能
把同一原始行中所有匹配到的功能用分号分隔,方便查看该行所有有效功能:
result = merged_data.groupby(['原始行ID', '蛋白ID集合'])['功能描述'].apply(lambda x: ';'.join(x.dropna())).reset_index() # 过滤掉完全没有匹配功能的行(如果需要保留所有原始行,可跳过此步) result = result[result['功能描述'] != '']
- 形式二:保留每个匹配蛋白的单独行
只保留能匹配到功能的条目,每条对应一个蛋白及其功能,同时保留原始行的信息:
result = merged_data.dropna(subset=['功能描述'])
注意事项
- 如果蛋白ID存在大小写不一致的情况,可提前统一格式,比如:
hit_expanded['蛋白ID'] = hit_expanded['蛋白ID'].str.strip().str.upper() database_df['蛋白ID'] = database_df['蛋白ID'].str.strip().str.upper() - 若原始hit_df有其他列,只需在
groupby时加入对应列名即可保留。
内容的提问来源于stack exchange,提问作者LJM
相关产品推荐
相关产品推荐

