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

Pandas 常用函数Общие функции Pandas


pd.pivot_table()— это функция в библиотеке Pandas, используемая длясоздания сводных таблиц. Сводная таблица — это распространённая функция в электронных таблицах, которая может группировать, агрегировать и преобразовывать данные, что упрощает анализ данных с разных точек зрения.

иpd.crosstab()По сравнению сpivot_table(), он более мощный: поддерживает несколько функций агрегирования, обработку пропущенных значений и более сложное преобразование данных.

Определение слова: pivot_tableозначает "сводная таблица" — это таблица, которая может динамически изменять компоновку данных и обобщать и анализировать данные по многим измерениям.


Базовый синтаксис и параметры

pd.pivot_table()— это функция верхнего уровня библиотеки Pandas, используемая для создания сводных таблиц.

Формат синтаксиса

pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

Описание параметра

  • Параметр: data
    • Тип: DataFrame.
    • Описание: DataFrame с исходными данными.
  • Параметр: values
    • Тип: имя столбца или список имён столбцов.
    • Описание: Столбец для агрегирования. Если не указан, будут агрегированы все числовые столбцы.
  • Параметр: index
    • Тип: имя столбца, список имён столбцов или функция.
    • Описание: Столбец, используемый в качестве индекса строк. Может быть одним столбцом или несколькими столбцами (список); несколько столбцов создают иерархический индекс.
  • Параметр: columns
    • Тип: имя столбца или список имён столбцов.
    • Описание: Столбец, используемый в качестве индекса столбцов.
  • Параметр: aggfunc
    • Тип: функция, строка или список функций.
    • Описание: Агрегационная функция. Распространённые значения включают 'sum', 'mean', 'count', 'min', 'max', 'median', 'std' и т. д. По умолчанию — 'mean'.
  • Параметр: fill_value
    • Тип: скаляр или None.
    • Описание: Значение, используемое для заполнения пропущенных значений.
  • Параметр: margins
    • Тип: Boolean.
    • Описание: Добавлять ли итоги по строкам и столбцам. По умолчаниюFalse。

Описание функции

  • Возвращаемое значение: Возвращает DataFrame, т. е. сводную таблицу.
  • Действие: Преобразует форму и обобщает данные в соответствии с указанными строками, столбцами и функцией агрегации.

Примеры

Давайте досконально освоим использованиеpd.pivot_table()на серии примеров от простого к сложному.

Пример 1: Базовое использование - Создание простой сводной таблицы

Пример

import pandas as pd
import numpy as np

# 1. Создание данных о продажах
sales = pd.DataFrame({
    'date': pd.date_range('2023-01-01', periods=12, freq='D'),
    '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 = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum')
print("n=== pd.pivot_table() Сводная таблица продаж ===")
print(pivot)

# 3. Используйте fill_value для заполнения пропущенных значений
print("n=== Заполнение пропущенных значений (fill_value=0) ===")
pivot_fill = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', fill_value=0)
print(pivot_fill)

Ожидаемый вывод:

=== 销售数据 ===
         date product  region  sales
0  2023-01-01       A   North    100
1  2023-01-01       B   North    150
2  2023-01-01       C   North    200
3  2023-01-01       A   South    180
4  2023-01-01       B   South    170
5  2023-01-01       C   South    160
6  2023-01-01       A   East    190
7  2023-01-01       B   East    200
8  2023-01-01       C   East    210
9  2023-01-01       A   West    220
10 2023-01-01       B   West    230
11 2023-01-01       C   West    240

=== pd.pivot_table() 销售透视表 ===
region   East  North  South  West
product
A         400.0   100.0  180.0  220.0
B         400.0   150.0  170.0  230.0
C         410.0   200.0  160.0  240.0

=== 填充缺失值 (fill_value=0) ===
region   East  North  South  West
product
A           400   100   180   220
B           400   150   170   230
C           410   200   160   240

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

  • Сводная таблица суммирует продажи по продукту (строка) и региону (столбец).
  • fill_value=0Отображает отсутствующие комбинации как 0 для удобства чтения.

Пример 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. Суммировать (sum)
print("n=== Сумма продаж ===")
sum_result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum')
print(sum_result)

# 3. Вычислить средние продажи
print("n=== Средние продажи ===")
mean_result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='mean')
print(mean_result.round(1))

# 4. Вычислить несколько статистик одновременно (передать список)
print("n=== Вычислить количество и среднее одновременно ===")
multi_agg = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc=['sum', 'mean'])
print(multi_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     210     200   220
B         200     150     370   230

=== 销售额平均值 ===
region   East  North  South  West
product
A          190   105.0   200   220
B          200   150.0   185   230

=== 同时计算数量和、均值 ===
        sum               mean
region  East North South West  East  North  South West
product
A       190   210   200   220   190  105.0   200   220
B       200   150   370   230   200  150.0  185.0   230

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

  • Использование различных функций агрегирования позволяет вычислять различные статистические показатели.
  • При одновременной передаче нескольких функций агрегирования сводная таблица создаёт многоуровневые индексы столбцов.

Пример 3: Использование margins для добавления итогов

Используйтеmarginsпараметр для добавления итогов по строкам и столбцам, что упрощает просмотр сводных данных.

Пример

import pandas as pd

# Использовать предыдущие данные о продажах
sales = pd.DataFrame({
    'product': ['A', 'B', 'A', 'B', 'A', 'B'],
    'region': ['North', 'North', 'South', 'South', 'East', 'East'],
    'sales': [100, 150, 200, 180, 190, 200]
})

# 1. Без итогов
print("=== Без итогов ===")
print(pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum'))

# 2. Добавить итоги по строкам и столбцам
print("n=== Добавить итоги (margins=True) ===")
result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', margins=True)
print(result)

# 3. Пользовательское название итога
print("n=== Пользовательское название итога ===")
result_name = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', margins=True, margins_name='Total')
print(result_name)

# 4. Итоги для многоуровневого индекса строк
print("n=== Многоуровневый индекс строк ===")
multi_index = pd.pivot_table(sales, values='sales', index=['product', 'region'], aggfunc='sum')
print(multi_index)

Ожидаемый вывод:

=== 无合计 ===
region   East  North  South
product
A          190   100   200
B          200   150   180

=== 添加合计 (margins=True) ===
region   East  North  South   All
product
A          190   100   200   490
B          200   150   180   530
All       390   250   380  1020

=== 自定义合计名称 ===
region   East  North  South   总计
product
A          190   100   200   490
B          200   150   180   530
总计       390   250   380  1020

=== 多层行索引 ===
                sales
product region
A       East        190
        North       100
        South       200
B       East        200
        North       150
        South       180

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

  • margins=TrueДобавляет строки и столбцы "Все", показывая общие итоговые данные.
  • margins_nameВы можете настроить название итога.

Пример 4: Многоуровневая индексация и сложное сводное преобразование

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

Пример

import pandas as pd

# 1. Создание данных с несколькими категориальными переменными
data = pd.DataFrame({
    'year': [2022, 2022, 2022, 2023, 2023, 2023],
    'quarter': ['Q1', 'Q2', 'Q3', 'Q1', 'Q2', 'Q3'],
    'product': ['A', 'A', 'B', 'B', 'A', 'B'],
    'sales': [100, 150, 200, 220, 180, 250]
})

print("=== Данные ===")
print(data)

# 2. Использование нескольких столбцов в качестве индекса строк
print("n=== Сводная таблица по нескольким годам и кварталам ===")
pivot = pd.pivot_table(data, values='sales', index=['year', 'quarter'], columns='product', aggfunc='sum')
print(pivot)

# 3. Использование нескольких столбцов в качестве индекса столбцов
print("n=== Сложное перекрёстное сводное преобразование ===")
pivot_multi = pd.pivot_table(data, values='sales', index='year', columns=['product', 'quarter'], aggfunc='sum')
print(pivot_multi)

# 4. Использование fill_value для обработки пропущенных значений
print("n=== Заполнение пропущенных значений ===")
pivot_fill = pd.pivot_table(data, values='sales', index=['year', 'quarter'], columns='product', aggfunc='sum', fill_value=0)
print(pivot_fill)

Ожидаемый вывод:

=== 数据 ===
   year quarter product  sales
0  2022      Q1      A    100
1  2022      Q2      A    150
2  2022      Q3      B    200
3  2023      Q1      B    220
4  2023      Q2      A    180
5  2023      Q3      B    250

=== 多年份多季度透视 ===
product           A      B
year quarter
2022 Q1       100.0    NaN
2022 Q2       150.0    NaN
2022 Q3         NaN  200.0
2023 Q1         NaN  220.0
2023 Q2       180.0    NaN
2023 Q3         NaN  250.0

=== 复杂交叉透视 ===
product         A         B
quarter        Q1    Q2   Q3   Q1   Q2   Q3
year
2022          100  150  200  NaN  NaN  NaN
2023          NaN  180  250  NaN  NaN  NaN

=== 填充缺失值 ===
product         A      B
year quarter
2022 Q1         100    0
2022 Q2         150    0
2022 Q3           0  200
2023 Q1           0  220
2023 Q2         180    0
2023 Q3           0  250

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

  • Многоуровневое индексирование достигается путем указанияindex=['year', 'quarter']в виде списка.
  • fill_value=0Заполните пропущенные данные единообразно значением 0, чтобы упростить последующие вычисления.

Совет: pd.pivot_table()предоставляет мощные возможности сводных таблиц. Если вам нужно только подсчитать частоту двух категориальных переменных,pd.crosstab()может быть более кратким.pd.crosstab()Возвращает частоты, тогда какpivot_table()может вычислять несколько статистик, таких как среднее, сумма, стандартное отклонение и т. д.pd.crosstab()можно рассматривать какpivot_table()Вaggfunc='count'частный случай, когда

Pandas 常用函数Общие функции Pandas

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