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

pandas DataFrame如何高效合并行去重 适配动态样本列数

pandas 肽段质谱数据行合并高效实现方案

你原来的嵌套循环是纯Python逐行遍历,数据量上来之后性能会非常差,用pandas原生的分组聚合就能实现需求,而且自动适配动态变化的得分列,不需要手动改列配置。

核心思路

  • 同一肽段对应的Protein Name、Calc. Mass属性完全一致,分组后取任意非空值即可
  • 动态得分列不需要提前硬编码,直接通过列名前缀Score sample_自动匹配,适配任意样本数量
  • 同一条肽段分散在不同行的得分,本质是每个得分列在对应行有非空值、其他行为空,分组后对每列取第一个非空值,就能自动把所有得分合并到同一行,和你原来循环填值、最后保留最后一行的逻辑完全等价
  • 聚合完成后自然没有重复肽段,也不会保留冗余的Sample列

实现代码

import pandas as pd
import numpy as np

def finalize(final_df):
    # 自动识别所有样本得分列,适配动态变化的样本数量
    score_cols = [col for col in final_df.columns if col.startswith("Score sample_")]
    # 固定属性列,同一肽段下值完全一致
    attr_cols = ["Protein Name", "Calc. Mass"]

    # 按肽段分组聚合,所有列取第一个非空值,自动合并分散的得分
    merged_df = final_df.groupby(
        by="Peptide", 
        as_index=False, 
        dropna=False
    )[attr_cols + score_cols].first()

    return merged_df

方案优势

  • 性能提升明显:所有聚合逻辑走pandas底层C实现,比Python层嵌套循环快数十到数百倍,数据量越大差距越明显
  • 鲁棒性更强:不需要逐行做索引判断、异常捕获,不会出现索引越界问题
  • 适配性强:不需要提前配置样本列数量,只要得分列名符合Score sample_x的格式就能自动识别
  • 逻辑可扩展:如果遇到同一样本同肽段有多个得分的特殊情况,只需要把聚合函数从first()换成max()、mean()等符合业务需求的函数即可,不需要调整整体结构

内容的提问来源于stack exchange,提问作者jc990

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 13:27:25