Pandas.DataFrame.groupby: примеры (PYTHON)
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 отсутствует в dfKeyError: '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.
Расширенные примеры
Группировка с применением пользовательской функции агрегации.
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 для применения функции к каждой группе с сохранением исходной формы данных.
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
Группировка с фильтрацией групп.
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
Группировка по временным интервалам.
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
- питон pandas.DataFrame.groupby - аргументы и возвращаемое значение
- Функция python pandas.DataFrame.groupby - описание
- pandas.DataFrame.groupby - примеры
- pandas.DataFrame.groupby - похожие методы на python
- pandas.DataFrame.groupby на php, c#, sql, java
- pandas.DataFrame.groupby изменения python
- Примеры pandas.DataFrame.groupby на питон