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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:09:09