Python Pandas: Сохраняется ли заказ при использовании groupby() и agg()?

Я использовал часто используемую функцию 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

В этом случае лямбда функционирует по назначению, выводя вторую строку в каждой группе. Однако я не смог найти что-либо в документации pandas, которая подразумевает, что во всех случаях это гарантировано. Я хочу использовать agg() вместе со средневзвешенной функцией, поэтому я хочу быть уверенным, что строки, входящие в функцию, будут в том же порядке, что и в исходном фрейме данных.

Кто-нибудь знает, в идеале, где-то в документах или pandas исходном коде, если это гарантировано?

Ответы

Ответ 1

Посмотрите это улучшение 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

Это НЕ верно для повторной выборки, поскольку для этого требуется монотонный индекс (он будет работать с немонотонным индексом, но сначала будет сортировать его).

Они представляют собой флаг sort= для группировки, но это относится к сортировке самих групп, а не к наблюдениям внутри группы.

FYI: df.groupby('A').nth(1) - безопасный способ получить второе значение группы (так как ваш метод выше не будет работать, если у группы есть < 2 элемента)

Ответ 3

Еще проще:

  import pandas as pd
  pd.pivot_table(df,index='A',aggfunc=(np.mean))

выход:

            B    C
     A                
   group1  11.0  101
   group2  17.5  175
   group3  11.0  101