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

Pandas分组聚合去重 自定义规则保留全部列的方法

pandas分组聚合保留所有列的实现方案

原有代码存在两个核心问题:一是仅手动指定了canonical、mane、metrics三列的聚合规则,其余列会被pandas自动丢弃;二是metrics列用['min','max']聚合会生成多级列名,也没有拼接成要求的区间格式,同时原有的非空判断逻辑没有处理空字符串的场景。

可以按以下方式调整代码,自动兼容所有同组取值一致的扩展列,不需要手动枚举列名:

完整实现代码

import pandas as pd

# 定义单列聚合逻辑
def check_has_valid(series):
    # 空字符串视为无效值,组内存在有效非空值返回Yes,否则返回No
    valid_count = series.replace('', pd.NA).notna().sum()
    return "Yes" if valid_count > 0 else "No"

def get_metrics_range(series):
    # 拼接组内metrics最小、最大值为区间格式
    return f"{series.min()}-{series.max()}"

# 自动生成全列聚合规则,无需手动枚举扩展列
agg_config = {}
for col in df.columns:
    if col == "Gene_name":
        continue  # 分组键跳过
    if col in ["canonical", "mane"]:
        agg_config[col] = check_has_valid
    elif col == "metrics":
        agg_config[col] = get_metrics_range
    else:
        # 同组取值完全一致的列,取第一个值即可,自动兼容后续新增的任意扩展列
        agg_config[col] = "first"

# 执行分组聚合,保持原列结构和顺序
df_result = df.groupby("Gene_name", as_index=False).agg(agg_config)[df.columns]

输出结果说明

运行后得到的结果完全符合要求:

  • canonical、mane列按规则返回Yes/No:比如ACOT组mane列存在有效值NA_0001返回Yes,canonical列全为空字符串返回No
  • metrics列格式为最小值-最大值的区间,比如ACOT组为1.4-1.7
  • Transcript_ID、start、end、Example_extra_col以及后续新增的任意同组取值一致的列都会被自动保留,不需要手动修改聚合配置
  • 最终输出的列数、列顺序和原DataFrame完全一致,不会出现多级列名问题

样例输出参考

Gene_nameTranscript_IDcanonicalmanemetricsstartendExample_extra_col
ACOT00001NoYes1.4-1.72030col1ACOT
PAN000090YesNo0.4-0.51030col1PAN
TOM000080YesNo0.4-1.71015col1TOM

内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:03:43