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列全为空字符串返回Nometrics列格式为最小值-最大值的区间,比如ACOT组为1.4-1.7Transcript_ID、start、end、Example_extra_col以及后续新增的任意同组取值一致的列都会被自动保留,不需要手动修改聚合配置- 最终输出的列数、列顺序和原DataFrame完全一致,不会出现多级列名问题
样例输出参考
| Gene_name | Transcript_ID | canonical | mane | metrics | start | end | Example_extra_col |
|---|---|---|---|---|---|---|---|
| ACOT | 00001 | No | Yes | 1.4-1.7 | 20 | 30 | col1ACOT |
| PAN | 000090 | Yes | No | 0.4-0.5 | 10 | 30 | col1PAN |
| TOM | 000080 | Yes | No | 0.4-1.7 | 10 | 15 | col1TOM |
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

