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

如何按自定义规则合并Pandas中按name分组的重复行?

如何按自定义规则分组合并Pandas DataFrame的重复行

完全可以用groupby配合自定义聚合逻辑来实现你的需求——这其实就是这类复杂合并场景的最佳解法,drop_duplicates确实没法处理这种自定义规则的合并,所以选对工具就解决大半问题了。

先看完整的实现代码,我们一步步拆解:

1. 准备示例数据

import pandas as pd

df = pd.DataFrame({ 
    'identifier': ['1', '2', None], 
    'name': ['Tom', 'Peter', 'Peter'], 
    'registered': [True, False, True] 
})

2. 分组并应用自定义聚合规则

我们需要针对不同列定义不同的合并逻辑:

  • identifier列:保留分组中非None的有效值;如果组内全是None则返回None
  • registered列:执行逻辑或操作,只要组内有一个True,结果就为True

这里有两种简洁的实现方式:

方式一:用lambda函数明确处理空值

df_result = df.groupby('name', as_index=False).agg(
    identifier=('identifier', lambda x: x.dropna().iloc[0] if not x.dropna().empty else None),
    registered=('registered', 'any')
)

方式二:利用max函数简化空值处理

因为在Pandas中,字符串类型的元素优先级高于None,所以直接用max就能自动选中非None的有效值,代码更简洁:

df_result = df.groupby('name', as_index=False).agg(
    identifier=('identifier', 'max'),
    registered=('registered', 'any')
)

3. 验证结果

运行后得到的df_result完全符合你的预期:

identifier    name  registered
0          2   Peter        True
1          1     Tom        True

关键逻辑说明

  • groupby('name', as_index=False):按name字段分组,as_index=False保证结果不会把name设为索引,保持原始的列结构
  • agg()方法是核心:它接受字典参数,键是结果的列名,值是元组(原列名,聚合函数)
    • 对于registered列,'any'聚合函数正好对应逻辑或操作,完美匹配需求
    • 对于identifier列,两种方式都能实现“保留非None值”的规则,第二种更简洁高效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:53:54