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

如何在Pandas中按id合并重复行,将多列内容合并至单个单元格

Pandas按ID合并重复行,拼接多列值为逗号分隔字符串

问题背景

现有如下Pandas DataFrame,存在重复的id值,需要将同一id对应的disease_type、disease_sub_type、study_abbreviation列值分别合并为单个单元格的逗号分隔字符串,便于后续数据集合并。

输入DataFrame代码

import pandas as pd

samples = [('001', 'RENAL', 'CHROMOPHOBE', 'KICH'),
         ('002', 'OVARIAN', 'HIGH_GRADE_SEROUS_CARCINOMA', 'LGSOC'),
         ('003', 'OVARIAN', 'OTHER', 'NaN'),
         ('001', 'COLORECTAL', 'ADENOCARCINOMA', 'KICH')]
labels = ['id', 'disease_type', 'disease_sub_type', 'study_abbreviation']
df = pd.DataFrame.from_records(samples, columns=labels)

输入的DataFrame展示:

id  disease_type  disease_sub_type              study_abbreviation
0   001 RENAL         CHROMOPHOBE                   KICH
1   002 OVARIAN       HIGH_GRADE_SEROUS_CARCINOMA   LGSOC
2   003 OVARIAN       OTHER                         NaN
3   001 COLORECTAL    ADENOCARCINOMA                KICH

期望输出

iddisease_typedisease_sub_typestudy_abbreviation
001RENAL,COLORECTALCHROMOPHOBE,ADENOCARCINOMAKICH, KICH
002OVARIANHIGH_GRADE_SEROUS_CARCINOMALGSOC
003OVARIANOTHERNaN

解决方案

使用groupby按id分组,配合自定义拼接函数将分组内的列值合并为逗号分隔字符串:

def join_values(series):
    # 处理字符串类型的'NaN',直接拼接;若为真实缺失值可调整逻辑
    return ','.join(series.astype(str))

# 按id分组并聚合
result_df = df.groupby('id', as_index=False).agg(join_values)

# 打印结果
print(result_df)

代码说明

  • groupby('id', as_index=False):按id进行分组,同时保持id作为普通列而非索引。
  • agg(join_values):对每个分组的所有列应用拼接函数,将列内的每个值用逗号连接成单个字符串。
  • 如果原数据中存在真实的Pandas缺失值(如pd.NA而非字符串'NaN'),可修改拼接函数保留缺失值:
    def join_values(series):
        non_null_vals = series.dropna().astype(str)
        return ','.join(non_null_vals) if len(non_null_vals) > 0 else pd.NA
    

运行上述代码后,输出结果与期望完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:50:24