Функция Pandas groupby.sum()
groupby.sum()— это агрегационная функция в Pandas, используемая для суммирования после группировки. Обычно она используется вместе сgroupby()— функция, которая сначала группирует данные по значениям столбца, а затем суммирует числовые столбцы в каждой группе.
В реальном анализе данных,sum()— это одна из наиболее часто используемых агрегационных функций. Например, расчёт общей заработной платы по каждому отделу, общих продаж по каждому региону, общего количества по каждой категории и т. д.
Базовый синтаксис и параметры
sum()— это метод объекта GroupBy. Сначала нужно использоватьgroupby(), чтобы сгруппировать данные, а затем вызвать его.
Формат синтаксиса
GroupBy.sum(numeric_only=False, min_count=-1, engine=None, engine_kwargs=None)
Описание параметра
| Параметр | Type | Описание | Значение по умолчанию |
|---|---|---|---|
| numeric_only | bool | Если True, суммируются только числовые столбцы; если False, предпринимается попытка суммировать все столбцы. | False |
| min_count | int | Минимальное количество допустимых значений, необходимое для суммирования. Если в группе допустимых значений меньше этого числа, возвращается NaN. | -1 |
| engine | str | Указывает вычислительный движок, который может быть 'cython' или 'numba'. None означает, что Pandas выбирает его автоматически. | Отсутствует |
| engine_kwargs | dict | Словарь дополнительных параметров, передаваемых в базовый движок. | Отсутствует |
Возвращаемое значение
- Тип возвращаемого значения:
SeriesилиDataFrame - Описание: Возвращает результат после группировки и суммирования. Если применяется к одному столбцу, возвращает Series; если применяется к нескольким столбцам, возвращает DataFrame.
Примеры
Через серию примеров от простых к сложным давайте тщательно освоимgroupby.sum()использование.
Пример 1: Базовое использование — группировка по одному столбцу и суммирование
Самый простой вариант использования — сгруппировать по значениям в одном столбце, а затем просуммировать другой столбец.
Пример
# Создать DataFrame с данными о продажах
# Смоделировать таблицу, содержащую регион, товар и продажи
data = {
'Region': ['North China', 'East China', 'South China', 'North China', 'East China', 'South China', 'North China', 'East China'],
'product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
'Sales amount': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
'Количество': [10, 20, 15, 18, 22, 16, 12, 21]
}
# Создать DataFrame
df = pd.DataFrame(data)
print("Исходные данные о продажах:")
print(df)
print()
# Сгруппировать по "Region" и вычислить общий объем продаж для каждого региона
sales_by_region = df.groupby('Region')['Sales amount'].sum()
print(Общий объем продаж по регионам:)
print(sales_by_region)
print()
# Сгруппировать по "Product" и вычислить общее количество продаж для каждого товара
quantity_by_product = df.groupby('product')['Quantity'].sum()
print(Общее количество продаж для каждого товара:)
print(quantity_by_product)
Вывод:
原始销售数据: 地区 产品 销售额 数量 0 华北 A 1000 10 1 华东 B 2000 20 2 华南 C 1500 15 3 华北 B 1800 18 4 华东 A 2200 22 5 华南 C 1600 16 6 华北 A 1200 12 7 华东 B 2100 21 每个地区的总销售额: 地区 华东 7100 华南 3100 华北 4000 dtype: int64 每个产品的总销售数量: 产品 A 44 B 59 C 31 dtype: int64
Пояснение кода:
df.groupby('地区')['销售额']Указывает, что данные сначала группируются по столбцу 'Region', а затем для операции выбирается столбец 'Sales amount'..sum()Суммирует продажи в каждой группе.- Возвращаемый результат — это Series, а индекс — значения столбца группировки (т. е. названия регионов).
Пример 2: Группировка по нескольким столбцам и суммирование
Можно группировать по нескольким столбцам одновременно, а затем суммировать числовые столбцы.
Пример
# Создать данные о продажах
data = {
'Region': ['North China', 'East China', 'South China', 'North China', 'East China', 'South China', 'North China', 'East China'],
'product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
'Sales amount': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100],
'Количество': [10, 20, 15, 18, 22, 16, 12, 21]
}
df = pd.DataFrame(data)
print("Исходные данные о продажах:")
print(df)
print()
# Группировка по столбцам 'Region' и 'Product', вычисление общей суммы продаж и общего количества
# as_index=False означает, что столбец группировки сохраняется как обычный столбец в результате.
grouped = df.groupby(['Region', 'product'], as_index=False).sum()
print("Итог после группировки по региону и продукту:")
print(grouped)
print()
# В качестве альтернативы можно суммировать все числовые столбцы, не указывая конкретные столбцы
grouped_all = df.groupby(['Region', 'product']).sum()
print("Сумма всех числовых столбцов (возвращает DataFrame):")
print(grouped_all)
Вывод:
原始销售数据:
地区 产品 销售额 数量
0 华北 A 1000 10
1 华东 B 2000 20
2 华南 C 1500 15
3 华北 B 1800 18
4 华东 A 2200 22
5 华南 C 1600 16
6 华北 A 1200 12
7 华东 B 2100 21
按地区和产品分组后的总计:
地区 产品 销售额 数量
0 华东 A 2200 22
1 华东 B 4100 41
2 华南 C 3100 31
3 华北 A 2200 22
4 华北 B 1800 18
对所有数值列求和(返回DataFrame):
销售额 数量
地区 产品
华东 A 2200 22
B 4100 41
华南 C 3100 31
华北 A 2200 22
B 1800 18
Пояснение кода:
['Region', 'Product']Использование списка позволяет группировать по нескольким столбцам одновременно.as_index=FalseВ этом случае результат имеет формат DataFrame, а столбцы группировки сохраняются как обычные столбцы.- Когда столбец не указан (например,
.sum()), вычисляется сумма всех числовых столбцов.
Пример 3: Использование параметра min_count
min_countЭтот параметр управляет минимальным количеством допустимых значений, необходимых для суммирования в группе. Когда количество допустимых значений в группе меньше этого числа, возвращается NaN.
Пример
import numpy as np
# Создать данные с пропущенными значениями
data = {
'Department': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'salary': [5000, 6000, np.nan, 7000, np.nan, np.nan, 8000, 9000, 10000]
}
df = pd.DataFrame(data)
print(Данные о зарплате сотрудников (включая пропущенные значения):)
print(df)
print()
# По умолчанию sum() игнорирует значения NaN при суммировании
sum_default = df.groupby('Department')['salary'].sum()
print(Сумма по умолчанию (игнорируя NaN):)
print(sum_default)
print()
# Установите min_count=3, чтобы для выполнения суммирования требовалось как минимум 3 допустимых значения
sum_min_count = df.groupby('Department')['salary'].sum(min_count=3)
print(Результат суммирования при min_count=3:)
print(sum_min_count)
print()
# Установите min_count=2
sum_min_count2 = df.groupby('Department')['salary'].sum(min_count=2)
print(Результат суммирования при min_count=2:)
print(sum_min_count2)
Вывод:
员工工资数据(包含缺失值): 部门 工资 0 A 5000.0 1 A 6000.0 2 A NaN 3 B 7000.0 4 B NaN 5 B NaN 6 C 8000.0 7 C 9000.0 8 C 10000.0 默认求和(忽略NaN): 部门 A 11000.0 B 7000.0 C 27000.0 dtype: float64 min_count=3 时的求和结果: 部门 A 11000.0 B NaN C 27000.0 dtype: float64 min_count=2 时的求和结果: 部门 A 11000.0 B 7000.0 C 27000.0 dtype: float64
Пояснение кода:
- По умолчанию,
sum()Он игнорирует значения NaN и суммирует только допустимые значения. min_count=3Это означает, что в каждой группе должно быть как минимум 3 допустимых значения до вычисления суммы; в противном случае возвращается NaN.- В отделе A есть 2 допустимых значения (5000 и 6000), что не соответствует min_count=3, поэтому возвращается NaN; в отделе C есть 3 допустимых значения, поэтому его можно суммировать обычным образом.
Примечания:
sum()По умолчанию значения NaN игнорируются при суммировании, что соответствует нашему повседневному пониманию обработки "null". Если перед суммированием нужно рассматривать NaN как 0, можно сначала использоватьfillna(0)метод для заполнения пропущенных значений.
Другие расширения