首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何才能将熊猫GroupBy的组组合在一起?

我如何才能将熊猫GroupBy的组组合在一起?
EN

Stack Overflow用户
提问于 2020-03-31 09:46:38
回答 1查看 251关注 0票数 1

我使用DataFrame.groupby()对具有相同键的行进行分组,同时保持以前排序的行顺序。我希望将这些组组合回一个完整的DataFrame,这样具有公共键的行将紧跟在第一个这样的行之后,而组首先以最大的col值开始。经过大量的实验和搜索split-apply-combine寻找单独的组合方法,我得出了下面的成语,它是有效的。它需要一个开放的编码身份函数,这向我暗示了我没有按照预期的方式使用GroupBy。有没有更好的成语?

代码语言:javascript
复制
df.sort_values(col, ascending=False).groupby(key, sort=False).apply(lambda g_df: g_df)

我很想知道在pandas documentation的什么地方我可以自己回答这个问题。

EN

回答 1

Stack Overflow用户

发布于 2020-03-31 10:01:46

我们可以先使用sort。因为pd.unique保留了顺序,所以它会查找按最高值排序的'key'。然后,通过设置索引并使用.loc,我们可以将它们组合在一起。

样本数据

代码语言:javascript
复制
import pandas as pd
df = pd.DataFrame({'col': [1,2,3,4,5,6,7,8,9,10],
                   'key': list('abababcacb')})

代码

代码语言:javascript
复制
df = df.sort_values('col', ascending=False)
df = df.set_index('key').loc[df['key'].unique()].reset_index()

  key  col
0   b   10
1   b    6
2   b    4
3   b    2
4   c    9
5   c    7
6   a    8
7   a    5
8   a    3
9   a    1

做你想做的另一种方式是创建一个helper列。您希望按组内的最大'col'值进行排序,因此使用transform将结果广播到一个帮助器列,我们对该列进行排序,然后删除该列。

代码语言:javascript
复制
df['key1'] = df.groupby('key')['col'].transform('max')
df = df.sort_values(['key1', 'col'], ascending=False).drop(columns='key1')

如果您想使用groupby,那么您实际上只是使用它来获取索引位置。一种直接的实现方式是只遍历concat对象,对组进行遍历:

代码语言:javascript
复制
df = pd.concat([gp for _,gp in df.sort_values('col', ascending=False).groupby('key', sort=False)])

但是,因为您只需要重新排列整个DataFranme,所以真的没有必要拆分它,只是为了将所有内容连接起来。.groups属性存储索引。将它们链接在一起并对原始DataFrame进行切片

代码语言:javascript
复制
from itertools import chain
idx = chain.from_iterable(df.sort_values('col', ascending=False)
                            .groupby('key', sort=False)
                            .groups.values())

df = df.loc[idx]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60942199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档