Python:聚合数据后合并单元格列表内重复值的问题
嘿,恭喜你已经搞定了分组聚合的核心部分!针对你现在想去掉每个单元格列表里重复值的需求,我给你分两种常见场景来提供解决方案:
处理列表去重的实用方案
1. 不关心元素顺序:用集合快速去重
如果你的业务场景里不需要保留columnB、columnC元素原本的出现顺序,直接把聚合后的列表转成集合再转回列表就可以,代码示例如下:
import pandas as pd # 假设你的原始数据集是df df_agg = df.groupby('columnA').agg({ 'columnB': lambda x: list(set(x)), # 转集合自动去重 'columnC': lambda x: list(set(x)) }).reset_index()
这种方法简单高效,但集合会打乱元素的原始顺序,适合顺序不重要的场景。
2. 需要保留元素原始出现顺序:用字典键特性或自定义函数
要是你得保留元素第一次出现的顺序,就不能用集合了。Python 3.7+的普通字典会保留插入顺序,用dict.fromkeys()就能轻松实现有序去重,代码如下:
def deduplicate_ordered(lst): return list(dict.fromkeys(lst)) # 将去重函数应用到聚合逻辑中 df_agg = df.groupby('columnA').agg({ 'columnB': deduplicate_ordered, 'columnC': deduplicate_ordered }).reset_index()
如果还在使用Python 3.6及以下版本(现在比较少见),可以改用collections.OrderedDict来实现相同效果:
from collections import OrderedDict def deduplicate_ordered(lst): return list(OrderedDict.fromkeys(lst))
关于列值格式的补充说明
你提到不确定列值格式的问题,其实只要columnB、columnC的元素是可哈希的基本类型(比如字符串、数字、日期等),上面的方法都能直接适用。如果是嵌套结构或不可哈希的类型(比如列表),可以先把元素转换为可哈希的格式(比如元组)再去重,不过这种场景相对少见。
另外,如果你之前的聚合是用agg(list)实现的,只需要把list替换成上面的去重函数就能无缝衔接,不用改动其他逻辑~
内容的提问来源于stack exchange,提问作者Datacrawler
相关产品推荐
相关产品推荐

