首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Pandas:使用groupby()和agg()时是否保持顺序?

Python Pandas:使用groupby()和agg()时是否保持顺序?
EN

Stack Overflow用户
提问于 2014-10-20 06:31:41
回答 5查看 28.3K关注 0票数 59

我经常使用pandas的agg()函数对data.frame的每一列运行汇总统计信息。例如,下面是生成平均值和标准差的方法:

df = pd.DataFrame({'A': ['group1', 'group1', 'group2', 'group2', 'group3', 'group3'],
                   'B': [10, 12, 10, 25, 10, 12],
                   'C': [100, 102, 100, 250, 100, 102]})

>>> df
[output]
        A   B    C
0  group1  10  100
1  group1  12  102
2  group2  10  100
3  group2  25  250
4  group3  10  100
5  group3  12  102

在这两种情况下,将单个行发送到agg函数的顺序并不重要。但请考虑以下示例,其中:

df.groupby('A').agg([np.mean, lambda x: x.iloc[1] ])

[output]

        mean  <lambda>  mean  <lambda>
A                                     
group1  11.0        12   101       102
group2  17.5        25   175       250
group3  11.0        12   101       102

在这种情况下,lambda按照预期的方式工作,输出每组中的第二行。然而,我在pandas文档中找不到任何暗示这在所有情况下都是正确的。我希望将agg()与加权平均函数一起使用,因此我希望确保进入该函数的行的顺序与它们在原始数据框中出现的顺序相同。

有没有人知道,最好是通过文档或pandas源代码中的某个地方,如果这是肯定的话?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-10-20 20:19:04

请参阅此增强issue

简而言之,答案是肯定的,groupby将保留传入的排序。你可以像这样用你的例子来证明这一点:

In [20]: df.sort_index(ascending=False).groupby('A').agg([np.mean, lambda x: x.iloc[1] ])
Out[20]: 
           B             C         
        mean <lambda> mean <lambda>
A                                  
group1  11.0       10  101      100
group2  17.5       10  175      100
group3  11.0       10  101      100

然而,这不适用于重采样,因为它需要单调索引(它将使用非单调索引,但将首先对其进行排序)。

他们是groupby的sort=标志,但这与组本身的排序有关,而不是组内的观察结果。

仅供参考:df.groupby('A').nth(1)是获取组的第二个值的安全方法(因为如果一个组有<2个元素,上面的方法将失败)

票数 33
EN

Stack Overflow用户

发布于 2016-12-04 01:11:04

Panda的0.19.1文档说"groupby保留了每个组中行的顺序“,所以这是有保证的行为。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html

票数 21
EN

Stack Overflow用户

发布于 2018-11-17 01:34:29

为了保持秩序,您需要传递.groupby(..., sort=False)。在您的示例中,分组列已经排序,因此没有区别,但通常必须使用sort=False标志:

 df.groupby('A', sort=False).agg([np.mean, lambda x: x.iloc[1] ])
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26456125

复制
相关文章

相似问题

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