如何在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
期望输出
| id | disease_type | disease_sub_type | study_abbreviation |
|---|---|---|---|
| 001 | RENAL,COLORECTAL | CHROMOPHOBE,ADENOCARCINOMA | KICH, KICH |
| 002 | OVARIAN | HIGH_GRADE_SEROUS_CARCINOMA | LGSOC |
| 003 | OVARIAN | OTHER | NaN |
解决方案
使用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
相关产品推荐
相关产品推荐

