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

如何以Pythonic方式在Pandas分组后将多列值合并为集合

Pandas按分组将多列合并为集合并返回DataFrame的Pythonic实现

这个问题问得很实用!当你已经掌握了单列分组转集合的操作后,要扩展到多列还保持DataFrame格式,其实有几种非常简洁的Pythonic写法,不用重复写多次apply(set)。

首先先确认下我们的示例数据:

import pandas as pd
df = pd.DataFrame({
    'user_id': [1, 2, 3, 4, 1, 2, 3],
    'class_type': ['Krav Maga', 'Yoga', 'Ju-jitsu', 'Krav Maga', 'Ju-jitsu','Krav Maga', 'Karate'],
    'instructor': ['Bob', 'Alice','Bob', 'Alice','Alice', 'Bob', 'Alice']
})

方法1:对所有分组列统一应用set

最简洁的方式就是用groupby后的agg()方法,直接传入set作为参数,它会自动对所有非分组列执行转集合的操作,返回的结果就是标准的DataFrame:

result = df.groupby('user_id').agg(set)

执行后得到的result长这样:

class_type           instructor
user_id                                  
1        {Ju-jitsu, Krav Maga}  {Bob, Alice}
2        {Yoga, Krav Maga}      {Alice, Bob}
3        {Ju-jitsu, Karate}     {Bob, Alice}
4        {Krav Maga}            {Alice}

方法2:针对特定列自定义操作

如果你不需要对所有列都转集合,只想处理指定的几列,可以给agg()传一个字典,键是列名,值是要应用的函数(这里就是set):

# 只处理class_type和instructor列
result = df.groupby('user_id').agg({'class_type': set, 'instructor': set})

这种方式灵活性更高,适合列数较多但只需要处理部分列的场景。

额外小提示

如果你需要集合保持元素的出现顺序(默认set是无序的),可以用lambda x: list(dict.fromkeys(x))来生成有序的唯一值列表(替代set),不过要注意这返回的是列表而不是集合,根据你的需求选择就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:33:10