如何在Pandas中实现分组聚合后生成有序集合结果?
解决聚合后结果无序的问题
嘿,我来帮你搞定这个问题~你现在得到的聚合结果是无序的,核心原因是Python的set是无序的数据结构,所以用它聚合后元素的顺序是随机的。要得到你期望的有序结果,我们只需要调整一下聚合函数就行,下面给你两种适配不同需求的方案:
方案1:保留元素的原始出现顺序(完全匹配你的期望)
你的预期结果里,to和idt的顺序和原始数据中元素第一次出现的顺序完全一致,这种情况我们可以用pd.unique()来实现——它会自动去重,同时保留元素第一次出现的顺序。
完整代码如下:
import pandas as pd data = {'message_id': ['1', '1', '1', '1', '2', '2', '2'], 'to': ['one', 'two', 'three', 'four', 'five', 'six', 'five'], 'idt': ['1','2','3','4','5','6','5'] } df = pd.DataFrame(data, columns = ['message_id','to','idt']) # 定义聚合函数:去重且保留原始出现顺序 agg_func_text = { 'to': lambda x: list(pd.unique(x)), 'idt': lambda x: list(pd.unique(x)) } # 分组聚合 df3 = df.groupby(['message_id']).agg(agg_func_text) print(df3)
运行后你会得到和预期完全一致的结果:
to idt message_id 1 [one, two, three, four] [1, 2, 3, 4] 2 [five, six] [5, 6]
方案2:按规则排序(比如字母/数字顺序)
如果你希望元素按统一规则排序(比如to列按字母顺序,idt列按数字大小),可以先通过set去重,再用sorted()指定排序逻辑:
import pandas as pd data = {'message_id': ['1', '1', '1', '1', '2', '2', '2'], 'to': ['one', 'two', 'three', 'four', 'five', 'six', 'five'], 'idt': ['1','2','3','4','5','6','5'] } df = pd.DataFrame(data, columns = ['message_id','to','idt']) # 聚合函数:去重后按规则排序 agg_func_text = { 'to': lambda x: sorted(set(x)), # 按字母顺序排序 'idt': lambda x: sorted(set(x), key=int) # 转成整数后按数字顺序排序 } df3 = df.groupby(['message_id']).agg(agg_func_text) print(df3)
运行结果:
to idt message_id 1 [four, one, three, two] [1, 2, 3, 4] 2 [five, six] [5, 6]
另外提一句:你之前写的df.sort_values(by=['message_id', 'to'])没有把排序后的结果赋值回df,所以不会改变原数据的顺序,如果需要先排序再处理,记得改成df = df.sort_values(by=['message_id', 'to'])哦~
内容的提问来源于stack exchange,提问作者Cesar Dolacio
相关产品推荐
相关产品推荐

