Функция Pandas DataFrame.pivot_table()
Часто используемые функции Pandas
df.pivot_table()является методом-членом DataFrame, используется длясоздания сводной таблицы. Этоpivot()улучшенная версия, поддерживает операции агрегации и может обрабатывать дублирующиеся комбинации индексов строк и столбцов.
Сводная таблица — один из наиболее часто используемых инструментов в анализе данных. Она позволяет группировать, обобщать и перестраивать данные с разных точек зрения, что облегчает обнаружение закономерностей и тенденций в данных.
Определение слова: pivot_tableозначает «сводная таблица», таблица, которая может динамически изменять макет данных и поддерживает автоматическую агрегацию дублирующихся данных.
Базовый синтаксис и параметры
df.pivot_table()является методом экземпляра DataFrame, вызываемым через оператор точки.
Формат синтаксиса
DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
Описание параметра
- Параметр:
index- Тип: имя столбца, метка, список меток или None.
- Описание: столбец, используемый в качестве индекса строк. Это может быть один столбец или несколько столбцов (список); несколько столбцов создают иерархический индекс.
- Параметр:
columns- Тип: имя столбца или метка.
- Описание: столбец, используемый в качестве индекса столбцов, используется для развёртывания уникальных значений в имена столбцов.
- Параметр:
values- Тип: имя столбца, метка, список меток или None.
- Описание: числовые столбцы для агрегации. Если не указано, агрегируются все числовые столбцы.
- Параметр:
aggfunc- Тип: функция, строка или список функций.
- Описание: Агрегатная функция. Обычные значения включают
'sum'(sum),'mean'(mean, по умолчанию),'count'(count),'min'(min),'max'(max),'median'(медиана),'std'(стандартное отклонение) и т. д.
- Параметр:
fill_value- Тип: скаляр или None.
- Описание: Значение, используемое для заполнения пропущенных значений. По умолчанию None, сохраняет NaN.
- Параметр:
margins- Тип: логическое значение.
- Описание: Добавлять ли итоги по строкам и столбцам. По умолчанию False. Если задано True, сводные данные добавляются в конце строк и столбцов.
- Параметр:
margins_name- Тип: string.
- Описание: Имя итоговой строки/столбца, по умолчанию 'All'. Допустимо только при margins=True.
Описание функций
- Возвращаемое значение: Возвращает DataFrame, то есть сводную таблицу.
- Особенности: В отличие от
pivot(),pivot_table()не вызывает ошибку для повторяющихся комбинаций index+columns и автоматически используетaggfuncдля агрегации.
Примеры
Давайте досконально освоим через серию примеров от простого к сложномуdf.pivot_table()использование.
Пример 1: Базовое использование - Создание простой сводной таблицы
Пример
# 1. Создание данных о продажах
sales = pd.DataFrame({
'product': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'region': ['North', 'North', 'North', 'South', 'South', 'South', 'East', 'East', 'East', 'West', 'West', 'West'],
'sales': [100, 150, 200, 180, 170, 160, 190, 200, 210, 220, 230, 240]
})
print("=== Данные о продажах ===")
print(sales)
# 2. Создать сводную таблицу — обобщить продажи по продукту и региону (агрегатная функция по умолчанию — среднее)
pivot = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='sum')
print("n=== df.pivot_table() Сводная таблица продаж (сумма)===")
print(pivot)
Ожидаемый вывод:
=== 销售数据 ===
product region sales
0 A North 100
1 B North 150
2 C North 200
3 A South 180
4 B South 170
5 C South 160
6 A East 190
7 B East 200
8 C East 210
9 A West 220
10 B West 230
11 C West 240
=== df.pivot_table() 销售透视表(求和)===
region East North South West
product
A 190 100 180 220
B 200 150 170 230
C 210 200 160 240
Пояснение к коду:
- Исходные данные представлены в длинном формате, где каждая строка фиксирует продажи продукта в определённом регионе.
pivot_table()Использует product в качестве индекса строк, region — в качестве индекса столбцов, а sales — в качестве значений.- Используйте
aggfunc='sum'для суммирования и обобщения продаж. - Результат — наглядная двумерная таблица, позволяющая легко сравнивать эффективность продаж разных продуктов в разных регионах.
Пример 2: Использование различных агрегатных функций
aggfuncПараметр может задавать несколько методов агрегации для анализа данных.
Пример
import numpy as np
# 1. Создайте более подробные данные о продажах (у каждого товара несколько записей)
sales = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West', 'North', 'South'],
'sales': [100, 150, 200, 180, 190, 200, 220, 230, 110, 190],
'quantity': [10, 15, 20, 18, 19, 20, 22, 23, 11, 19]
})
print("=== Данные о продажах ===")
print(sales)
# 2. Рассчитайте средний объём продаж (агрегатная функция по умолчанию)
print("n=== Средние продажи ===")
mean_result = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='mean')
print(mean_result.round(1))
# 3. Использование нескольких агрегатных функций одновременно (передача словаря)
print("n=== Несколько агрегатных функций ===")
multi_agg = sales.pivot_table(
values='sales',
index='product',
columns='region',
aggfunc={'sales': ['sum', 'mean', 'max']}
)
print(multi_agg)
# 4. Для разных столбцов используются разные агрегатные функции
print("n=== Разные столбцы — разные агрегации ===")
diff_agg = sales.pivot_table(
values=['sales', 'quantity'],
index='product',
columns='region',
aggfunc={'sales': 'sum', 'quantity': 'mean'}
)
print(diff_agg)
Ожидаемый вывод:
=== 销售数据 ===
product region sales quantity
0 A North 100 10
1 B North 150 15
2 A South 200 20
3 B South 180 18
4 A East 190 19
5 B East 200 20
6 A West 220 22
7 B West 230 23
8 A North 110 11
9 B South 190 19
=== 销售额平均值 ===
region East North South West
product
A 190.0 105.0 200.0 220.0
B 200.0 150.0 185.0 230.0
=== 多聚合函数 ===
sales
sum mean max
region East North South West East North South West East North South West
product
A 190 210 200 220 190 105 200 220 190 110 200 220
B 200 150 370 230 200 150 185 230 200 150 190 230
=== 不同列不同聚合 ===
sales quantity
region East North South West East North South West
product
A 190 210 200 220 19.0 10.5 20.0 22.0
B 200 150 370 230 20.0 15.0 18.5 23.0
Пояснение к коду:
aggfuncМожет быть одной строкой (например, 'sum', 'mean'), списком или словарём.- При передаче словаря для разных столбцов можно указать разные агрегатные функции.
- Средний объём продаж продукта A в северном регионе равен 105 ((100+110)/2), что демонстрирует способность pivot_table() автоматически обрабатывать повторяющиеся значения.
Пример 3: Использование margins для добавления итогов
Используйтеmarginsэтот параметр может добавлять итоги по строкам и столбцам, что упрощает просмотр сводных данных.
Пример
# 1. Создание данных о продажах
sales = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West'],
'sales': [100, 150, 200, 180, 190, 200, 220, 230]
})
# 2. Сводная таблица без итогов
print("=== Без итогов ===")
no_margins = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='sum')
print(no_margins)
# 3. Добавление итогов по строкам и столбцам
print("n=== Добавление итогов (margins=True) ===")
with_margins = sales.pivot_table(
values='sales',
index='product',
columns='region',
aggfunc='sum',
margins=True
)
print(with_margins)
# 4. Пользовательское название итога
print("n=== Пользовательское название итога ===")
custom_name = sales.pivot_table(
values='sales',
index='product',
columns='region',
aggfunc='sum',
margins=True,
margins_name='Total'
)
print(custom_name)
# 5. Сводная таблица с многоуровневым индексом строк
print("n=== Многоуровневый индекс строк ===")
multi_index = sales.pivot_table(
values='sales',
index=['product', 'region'],
aggfunc='sum'
)
print(multi_index)
Ожидаемый вывод:
=== 无合计 === region East North South West product A 190 100 200 220 B 200 150 180 230 === 添加合计 (margins=True) === region East North South West All product A 190 100 200 220 710 B 200 150 180 230 760 All 390 250 380 450 1470 === 自定义合计名称 === region East North South West 总计 product A 190 100 200 220 710 B 200 150 180 230 760 总计 390 250 380 450 1470
Пояснение к коду:
margins=TrueДобавляет строку "Все" (итог) внизу и столбец "Все" (итог) справа от сводной таблицы.- Вы можете использовать
margins_nameпараметр для настройки имени итогов, например 'Итого'. - Столбец "Все" отображает общий объем продаж каждого продукта по всем регионам, строка "Все" отображает общий объем продаж всех продуктов в каждом регионе, а в правом нижнем углу — общий итог всех данных.
Пример 4: Использование fill_value для обработки пропущенных значений
Используйтеfill_valueпараметр может заполнять пропущенные значения, возникающие после сводки.
Пример
import numpy as np
# 1. Создание данных (некоторые комбинации продукт-регион отсутствуют)
sales = pd.DataFrame({
'product': ['A', 'B', 'A', 'B'],
'region': ['North', 'North', 'South', 'South'],
'sales': [100, 150, 200, 180]
})
print("=== Исходные данные ===")
print(sales)
# 2. Не заполнять пропущенные значения (по умолчанию)
print("n=== Пропущенные значения не заполнены ===")
no_fill = sales.pivot_table(values='sales', index='product', columns='region')
print(no_fill)
# 3. Заполнить пропущенные значения 0
print("n=== Заполнение пропущенных значений 0 ===")
fill_zero = sales.pivot_table(
values='sales',
index='product',
columns='region',
fill_value=0
)
print(fill_zero)
# 4. Продемонстрировать автоматическую агрегацию повторяющихся значений
data_with_duplicates = pd.DataFrame({
'product': ['A', 'A', 'B', 'B', 'A'],
'region': ['North', 'North', 'South', 'South', 'North'],
'sales': [100, 120, 200, 180, 90]
})
print("n=== Данные с дублирующимися значениями ===")
print(data_with_duplicates)
print("n=== Автоматическая агрегация (pivot вызывает ошибку, pivot_table автоматически суммирует) ===")
auto_agg = data_with_duplicates.pivot_table(
values='sales',
index='product',
columns='region',
aggfunc='sum'
)
print(auto_agg)
Ожидаемый вывод:
=== 原始数据 === product region sales 0 A North 100 1 B North 150 2 A South 200 3 B South 180 === 不填充缺失值 === region North South product A 100.0 200.0 B 150.0 180.0 === 填充缺失值为0 === region North South product A 100 200 B 150 180 === 重复值数据 === product region sales 0 A North 100 1 A North 120 2 B South 200 3 B South 180 4 A North 90 === 自动聚合(pivot会报错,pivot_table自动求和)=== region North South product A 310 NaN B NaN 380
Пояснение к коду:
fill_value=0Пропущенные значения можно заполнить 0 для упрощения последующих вычислений.- Когда есть дублирующиеся комбинации товар-регион,
pivot_table()автоматически используетaggfuncдля агрегации, тогда какpivot()вызывает ошибку. - Общий объём продаж товара A в северном регионе составляет 310 (100+120+90), что является результатом автоматического суммирования.
Примечания
Важные замечания:
pivot_table()иpivot()Основное отличие заключается в обработке дублирующихся значений: pivot_table автоматически агрегирует, тогда как pivot вызывает ошибку.- Когда
valuesЕсли параметр не указан, все числовые столбцы будут агрегированы.marginsИтоговые строки/столбцы, добавленные параметром, могут повлиять на последующую обработку данных; используйте с осторожностью.- При обработке крупномасштабных данных pivot_table может потреблять много памяти; обратите внимание на контроль объёма данных.
Другие расширения