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
相关产品推荐
相关产品推荐

