给定一个数据帧,将列的每个组的值折叠为一个集合非常简单:
df.groupby('A')['B'].apply(set)
但是,如果您想在多个列上执行此操作,并且结果是在一个数据帧中,那么如何以pythonic方式执行此操作呢?你知道吗
例如,对于以下数据帧:
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方式生成的数据帧:
|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列的表,并且我想以一种python的方式来实现它,那会怎么样?”你知道吗
目前我有一个解决方案,但我不认为这是最好的方法:
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)
提前谢谢!你知道吗
或@jezrael的较短版本:
这里有一个
collections.defaultdict
方法。Pythonic是主观的。你知道吗这个解决方案肯定不是泛化的。当将
groupby.agg
与lambda
一起使用时,数据帧通常会有很大的开销,因此您可能会发现下面的解决方案更有效。你知道吗结果:
相关问题 更多 >
编程相关推荐