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 элемента)
Ответ 2
Panda 0.19.1 doc говорит: "groupby сохраняет порядок строк внутри каждой группы", поэтому это гарантированное поведение.
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html
Ответ 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