Pandas.DataFrame.groupby: примеры (PYTHON)

Группировка данных с помощью метода groupby в Pandas
Раздел: Pandas, Агрегация данных
pandas.DataFrame.groupby(by: mapping, function, label, or list of labels, axis: int=0, level: int=None, as_index: bool=True, sort: bool=True, group_keys: bool=False, squeeze: bool=False, observed: bool=False): pandas.core.groupby.GroupBy

Основы функции groupby

Метод pandas.DataFrame.groupby() используется для разделения данных в DataFrame на группы на основе заданных критериев с последующей агрегацией, преобразованием или фильтрацией. Эта операция является аналогом конструкции GROUP BY в SQL и часто применяется для анализа данных.

Аргументы метода

  • by: Критерий группировки. Принимает строку с именем столбца, список строк, функцию, словарь, объект Series или массив.
  • axis: Ось для группировки. По умолчанию 0 (строки).
  • level: Уровень для группировки в случае MultiIndex.
  • as_index: Возвращать группирующие столбцы как индекс. Значение по умолчанию True.
  • sort: Сортировать ключи групп. По умолчанию True.
  • group_keys: Добавлять ключи групп к индексу. По умолчанию False.
  • observed: Используется только для категориальных данных. По умолчанию False.
  • dropna: Исключать группы с ключами NaN. По умолчанию True.

Возвращаемое значение

Метод возвращает объект DataFrameGroupBy, который является промежуточным представлением и требует вызова метода агрегации (например, sum(), mean()), преобразования (transform()) или фильтрации (filter()).

Примеры использования

Группировка по одному столбцу с суммированием.

import pandas as pd
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar'], 'B': [1, 2, 3, 4]})
result = df.groupby('A').sum()
print(result)
      B
A      
bar   6
foo   4

Группировка по нескольким столбцам.

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar'], 'B': ['x', 'x', 'y', 'y'], 'C': [1, 2, 3, 4]})
result = df.groupby(['A', 'B']).mean()
print(result)
          C
A   B      
bar x   2.0
    y   4.0
foo x   1.0
    y   3.0

Использование параметра as_index.

result = df.groupby(['A', 'B'], as_index=False).mean()
print(result)
     A  B    C
0  bar  x  2.0
1  bar  y  4.0
2  foo  x  1.0
3  foo  y  3.0

Похожие функции в Python

  • pandas.pivot_table: Создает сводную таблицу. Более гибкая функция для агрегации с поддержкой многомерных данных.
  • pandas.crosstab: Вычисляет частотную таблицу для двух или более факторов.
  • Методы агрегации без группировки: Например, df.sum() или df.mean() без предварительного разделения на группы.

Выбор метода зависит от задачи. Для простого разделения данных по категориям подходит groupby. Для создания сложных сводных таблиц удобнее использовать pivot_table.

Альтернативы в других языках

SQL: Используется оператор GROUP BY.

SELECT A, SUM(B) FROM table GROUP BY A;

JavaScript (библиотека Lodash): Функция _.groupBy().

const data = [
  { A: 'foo', B: 1 },
  { A: 'bar', B: 2 },
  { A: 'foo', B: 3 }
];
const result = _.groupBy(data, 'A');
console.log(result);
{ foo: [ { A: 'foo', B: 1 }, { A: 'foo', B: 3 } ],
  bar: [ { A: 'bar', B: 2 } ] }

Java (Stream API): Используются коллекторы.

Map result = data.stream()
    .collect(Collectors.groupingBy(
        Item::getA,
        Collectors.summingInt(Item::getB)
    ));

Основное отличие от pandas заключается в том, что эти реализации обычно работают с коллекциями объектов, а не с табличными структурами.

Типичные ошибки

Забывание вызова агрегирующей функции после groupby.

grouped = df.groupby('A')
print(grouped)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x...>

Попытка обратиться к несуществующему столбцу после группировки.

result = df.groupby('A')['C'].sum()  # Столбец C отсутствует в df
KeyError: 'C'

Неправильное понимание параметра as_index.

result = df.groupby('A', as_index=True).sum()
print(result.index.name)
A

Изменения в последних версиях

В версии pandas 1.5.0 улучшена производительность группировки для некоторых типов данных. В версии 1.3.0 добавлена возможность передачи функции в параметр by для более гибкой группировки. С версии 1.1.0 параметр dropna по умолчанию имеет значение True.

Расширенные примеры

Группировка с применением пользовательской функции агрегации.

Пример python
def custom_agg(series):
    return series.max() - series.min()

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar'], 'B': [1, 2, 3, 4]})
result = df.groupby('A')['B'].agg(custom_agg)
print(result)
A
bar    2
foo    2
Name: B, dtype: int64

Использование метода transform для применения функции к каждой группе с сохранением исходной формы данных.

Пример python
df['B_group_mean'] = df.groupby('A')['B'].transform('mean')
print(df)
     A  B  B_group_mean
0  foo  1           2.0
1  bar  2           3.0
2  foo  3           2.0
3  bar  4           3.0

Группировка с фильтрацией групп.

Пример python
filtered = df.groupby('A').filter(lambda x: x['B'].mean() > 2.5)
print(filtered)
     A  B  B_group_mean
1  bar  2           3.0
3  bar  4           3.0

Группировка по временным интервалам.

Пример python
df_time = pd.DataFrame({
    'date': pd.date_range('2023-01-01', periods=6, freq='D'),
    'value': [10, 20, 30, 40, 50, 60]
})
result = df_time.groupby(pd.Grouper(key='date', freq='2D')).sum()
print(result)
            value
date            
2023-01-01     30
2023-01-03     70
2023-01-05     60

питон pandas.DataFrame.groupby function comments

En
Pandas.DataFrame.groupby Group DataFrame using a mapper or by columns