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

Bri*_*ack 28 python aggregate pandas

我经常使用用过的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
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,将各行发送到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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,lambda按预期运行,输出每组中的第二行.但是,我无法在pandas文档中找到任何内容,这意味着在所有情况下都保证这是真的.我希望agg()与加权平均函数一起使用,因此我想确保进入函数的行的顺序与它们在原始数据框中出现的顺序相同.

有没有人知道,理想情况下,通过docs或pandas源代码中的某个地方,如果保证是这样的话?

Jef*_*eff 17

请参阅此增强问题

简短的回答是肯定的,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
Run Code Online (Sandbox Code Playgroud)

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

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

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


Dim*_*iev 15

为了保持顺序,您需要通过.groupby(..., sort=False). 在您的情况下,分组列已经排序,因此没有区别,但通常必须使用该sort=False标志:

 df.groupby('A', sort=False).agg([np.mean, lambda x: x.iloc[1] ])
Run Code Online (Sandbox Code Playgroud)

  • groupby 有一个 sort= 标志,但这与组本身的排序有关,而不是与组内的观察值有关。 (4认同)
  • 具有讽刺意味的是,文档还说“通过关闭此功能可以获得更好的性能”。这也是为什么它应该是可选功能而不是默认功能的另一个原因。最重要的是,它会对调用者可能意想不到的数据进行更改。 (4认同)
  • 从 pandas 版本 1.5.3 开始,`sort` 默认为 True。这与我的预期相反。 (2认同)

Uwe*_*yer 8

Panda的0.19.1 doc说"groupby保留了每个组中行的顺序",所以这是保证行为.

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


Jig*_*ath 5

参考: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html

API 接受“SORT”作为参数。

SORT 参数的描述如下:

sort : bool,默认 True Sort 组键。关闭此功能可获得更好的性能。请注意,这不会影响每组内的观察顺序。Groupby 保留每个组中行的顺序

因此,很明显“Groupby”确实保留了每个组内行的顺序。