You need to enable JavaScript to run this app. Python Pandas 如何基于单列删除重复行并拼接多列信息?
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas 如何基于单列删除重复行并拼接多列信息?

Pandas 分组多列拼接去重实现方案

核心逻辑

你之前逐列apply(set)的方式只能处理单列,如果要同时对多列做同规则的去重拼接,只需要抽出通用的聚合函数,按ID分组后给每列单独指定聚合规则即可,不需要逐列重复写分组逻辑。

实操步骤

  • 先按你的需求把空值填充为指定占位符,避免聚合时丢失取值
  • 直接以唯一标识ID为分组键,不需要把同ID下取值无差异的Age、Gender放到分组键中——这类列在同组内取值完全一致,直接取组内第一个值即可
  • 对同ID下存在多取值、需要拼接的列,统一调用自定义的去重拼接函数处理

可直接运行的代码

  1. 先定义通用的去重拼接工具函数(默认保留原始出现顺序,和你给出的期望输出格式完全匹配):
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)
  1. 执行分组聚合流程:
# 按需求填充空值
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)

结果说明

运行后输出的结构和你期望的格式完全一致:

IDAgeGenderFormSignatureLevel
00030MPaper, ElectronicYes, NoA, B
00142PaperNoB

灵活调整说明

  • 如果不需要保留原始出现顺序,仅追求代码简洁,可以把dedup_concat简化为集合去重的写法,减少循环逻辑
  • 如果同ID下的Age、Gender也存在取值不一致的情况,只需要把对应列的聚合规则从'first'改为dedup_concat,就会自动把不同取值拼接为逗号分隔的字符串
  • 如果不想提前统一填充空值,可以直接在dedup_concat函数里调整空值判断逻辑,不需要修改整体分组流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 03:06:09