Функция Pandas DataFrame.pivot_table()

Pandas 常用函数Часто используемые функции 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: Базовое использование - Создание простой сводной таблицы

Пример

import pandas as pd

# 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

Пояснение к коду:

  1. Исходные данные представлены в длинном формате, где каждая строка фиксирует продажи продукта в определённом регионе.
  2. pivot_table()Использует product в качестве индекса строк, region — в качестве индекса столбцов, а sales — в качестве значений.
  3. Используйтеaggfunc='sum'для суммирования и обобщения продаж.
  4. Результат — наглядная двумерная таблица, позволяющая легко сравнивать эффективность продаж разных продуктов в разных регионах.

Пример 2: Использование различных агрегатных функций

aggfuncПараметр может задавать несколько методов агрегации для анализа данных.

Пример

import pandas as pd
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этот параметр может добавлять итоги по строкам и столбцам, что упрощает просмотр сводных данных.

Пример

import pandas as pd

# 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 pandas as pd
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 может потреблять много памяти; обратите внимание на контроль объёма данных.

Pandas 常用函数Часто используемые функции Pandas

Другие расширения