如何以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
相关产品推荐
相关产品推荐

