如何按自定义规则合并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
相关产品推荐
相关产品推荐

