将值折叠到 Pandas 数据帧中每组多列的集合中的pythonic方法是什么? [英] What is the pythonic way of collapsing values into a set for multiple columns per each group in pandas dataframes?

查看:57
本文介绍了将值折叠到 Pandas 数据帧中每组多列的集合中的pythonic方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定一个数据框,将一个列的每组值折叠成一个集合很简单:

Given a dataframe, collapsing values into a set per group for a column is straightforward:

df.groupby('A')['B'].apply(set)

但是,如果您想在多个列上执行此操作并且结果在数据框中,您如何以 Pythonic 的方式执行此操作?

But how do you do it in a pythonic way if you want to do it on multiple columns and the result to be in a dataframe?

例如对于以下数据框:

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', 'Alice','Bob']})

想要的结果是下面以pythonic方式生成的数据框:

The result wanted is the data frame below produced in a pythonic way:

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

这是一个虚拟示例.这个问题源于:如果我有一个包含 30 列的表并且我想以 Pythonic 的方式实现这一点怎么办?"

This is a dummy example. The question spurred from: "what if I have a table with 30 columns and I want to achieve this in a pythonic way?"

目前我有一个解决方案,但我认为这不是最好的方法:

Currently I have a solution but I don't think is the best way to do it:

df[['grouped_B', 'grouped_C']] = df.groupby('A')[['B','C']].transform(set)
deduped_and_collapsed_df = df.groupby('A')[['A','grouped_B', 'grouped_C']].head(1)

先谢谢你!

推荐答案

In [11]: df.groupby('user_id', as_index=False).agg(lambda col: set(col.values.tolist()))
Out[11]:
   user_id             class_type    instructor
0        1  {Krav Maga, Ju-jitsu}  {Alice, Bob}
1        2      {Yoga, Krav Maga}       {Alice}
2        3     {Ju-jitsu, Karate}         {Bob}
3        4            {Krav Maga}       {Alice}

或更短版本来自@jezrael:

or shorter version from @jezrael:

In [12]: df.groupby('user_id').agg(lambda x: set(x))
Out[12]:
                    class_type    instructor
user_id
1        {Krav Maga, Ju-jitsu}  {Alice, Bob}
2            {Yoga, Krav Maga}       {Alice}
3           {Ju-jitsu, Karate}         {Bob}
4                  {Krav Maga}       {Alice}

这篇关于将值折叠到 Pandas 数据帧中每组多列的集合中的pythonic方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆