Python Pandas 如何基于单列删除重复行并拼接多列信息?
Pandas 分组多列拼接去重实现方案
核心逻辑
你之前逐列apply(set)的方式只能处理单列,如果要同时对多列做同规则的去重拼接,只需要抽出通用的聚合函数,按ID分组后给每列单独指定聚合规则即可,不需要逐列重复写分组逻辑。
实操步骤
- 先按你的需求把空值填充为指定占位符,避免聚合时丢失取值
- 直接以唯一标识
ID为分组键,不需要把同ID下取值无差异的Age、Gender放到分组键中——这类列在同组内取值完全一致,直接取组内第一个值即可 - 对同ID下存在多取值、需要拼接的列,统一调用自定义的去重拼接函数处理
可直接运行的代码
- 先定义通用的去重拼接工具函数(默认保留原始出现顺序,和你给出的期望输出格式完全匹配):
import pandas as pd def dedup_concat(series): seen_items = set() ordered_valid_items = [] # 遍历组内的所有值,保留出现顺序的同时去重 for item in series: item_str = str(item).strip() # 跳过空值、预设占位符 if item_str == '' or item == 'Not Noted': continue # 跳过已经出现过的重复值 if item in seen_items: continue seen_items.add(item) ordered_valid_items.append(item_str) # 有效内容用英文逗号拼接为字符串 return ', '.join(ordered_valid_items)
- 执行分组聚合流程:
# 按需求填充空值 df = df.fillna('Not Noted') # 逐列定义对应的聚合规则 agg_config = { 'Age': 'first', # 同ID下取值无差异,直接取组内首个值即可 'Gender': 'first', # 同ID下取值无差异,直接取组内首个值即可 'Form': dedup_concat, 'Signature': dedup_concat, 'Level': dedup_concat } # 按ID分组聚合,保留ID列作为普通列不设为索引 result_df = df.groupby('ID', as_index=False).agg(agg_config)
结果说明
运行后输出的结构和你期望的格式完全一致:
| ID | Age | Gender | Form | Signature | Level |
|---|---|---|---|---|---|
| 000 | 30 | M | Paper, Electronic | Yes, No | A, B |
| 001 | 42 | Paper | No | B |
灵活调整说明
- 如果不需要保留原始出现顺序,仅追求代码简洁,可以把
dedup_concat简化为集合去重的写法,减少循环逻辑 - 如果同ID下的
Age、Gender也存在取值不一致的情况,只需要把对应列的聚合规则从'first'改为dedup_concat,就会自动把不同取值拼接为逗号分隔的字符串 - 如果不想提前统一填充空值,可以直接在
dedup_concat函数里调整空值判断逻辑,不需要修改整体分组流程
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

