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

如何用类似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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:15:37