5.3 透视表 (pivot_table)


文档摘要

5.3 透视表 (pivottable) Pandas 透视表 (pivottable) 详解:数据聚合与分组的利器 透视表的基本概念 透视表的核心思想是将数据表中的行和列进行重新排列,并对特定单元格的数据进行聚合计算。它允许我们: 选择索引 (index): 将一列或多列的值作为新的行索引。 选择列 (columns): 将一列或多列的值作为新的列标签。 选择值 (values): 将一列或多列的值作为要聚合的数据。 定义聚合函数 (aggfunc): 指定如何对值进行聚合,例如求和、平均值、计数等。 通过灵活地组合这些参数,我们可以生成各种各样的透视表,以满足不同的分析需求。 函数的语法 函数的基本语法如下: 各个参数的含义如下: : 要进行透视的数据框 (DataFrame)。

5.3 透视表 (pivot_table)

Pandas 透视表 (pivot_table) 详解:数据聚合与分组的利器

1. 透视表的基本概念

透视表的核心思想是将数据表中的行和列进行重新排列,并对特定单元格的数据进行聚合计算。它允许我们:

  • 选择索引 (index): 将一列或多列的值作为新的行索引。

  • 选择列 (columns): 将一列或多列的值作为新的列标签。

  • 选择值 (values): 将一列或多列的值作为要聚合的数据。

  • 定义聚合函数 (aggfunc): 指定如何对值进行聚合,例如求和、平均值、计数等。

通过灵活地组合这些参数,我们可以生成各种各样的透视表,以满足不同的分析需求。

2. pivot_table 函数的语法

pivot_table 函数的基本语法如下:

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

各个参数的含义如下:

  • data: 要进行透视的数据框 (DataFrame)。

  • values: 要聚合的列名(可选)。如果未指定,则所有数值列都将被聚合。

  • index: 作为行索引的列名或列名列表。

  • columns: 作为列标签的列名或列名列表。

  • aggfunc: 聚合函数,可以是字符串(例如 'mean', 'sum', 'count'),也可以是函数(例如 np.mean, len),或者是一个聚合函数的列表或字典。如果未指定,则默认为 'mean'。

  • fill_value: 用于填充缺失值的值(可选)。

  • margins: 是否添加行和列的总计(可选)。默认为 False

  • dropna: 是否删除包含缺失值的行(可选)。默认为 True

  • margins_name: 总计行的名称(可选)。默认为 'All'。

  • observed: 仅对分类数据生效,是否仅显示观察到的值 (observed values)。

  • sort: 是否对结果进行排序。

3. 代码实践与详解

为了更好地理解 pivot_table 的用法,我们使用一个示例数据集来演示。假设我们有一个销售数据集,包含以下信息:

  • Date: 销售日期

  • Region: 销售区域

  • Product: 销售产品

  • Sales: 销售额

  • Quantity: 销售数量

首先,我们创建一个示例 DataFrame:

import pandas as pd import numpy as np data = { 'Date': pd.to_datetime(['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-03', '2023-01-03']), 'Region': ['North', 'South', 'North', 'South', 'North', 'South'], 'Product': ['A', 'B', 'A', 'B', 'A', 'B'], 'Sales': [100, 150, 120, 180, 110, 160], 'Quantity': [10, 15, 12, 18, 11, 16] } df = pd.DataFrame(data) print(df)

输出:

Date Region Product Sales Quantity 0 2023-01-01 North A 100 10 1 2023-01-01 South B 150 15 2 2023-01-02 North A 120 12 3 2023-01-02 South B 180 18 4 2023-01-03 North A 110 11 5 2023-01-03 South B 160 16

3.1 基本透视表:按区域和产品汇总销售额

我们首先创建一个简单的透视表,按区域和产品汇总销售额。

pivot_table = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc='sum') print(pivot_table)

输出:

Product A B Region North 330.0 NaN South NaN 490.0

在这个例子中:

  • values='Sales' 指定我们要聚合的列是 'Sales'。

  • index='Region' 指定 'Region' 列作为行索引。

  • columns='Product' 指定 'Product' 列作为列标签。

  • aggfunc='sum' 指定使用求和函数进行聚合。

结果显示了每个区域和产品的总销售额。 注意到存在 NaN 值,这表示在特定区域没有销售特定产品。

3.2 填充缺失值

我们可以使用 fill_value 参数来填充缺失值。

pivot_table = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc='sum', fill_value=0) print(pivot_table)

输出:

Product A B Region North 330 0 South 0 490

现在,NaN 值被替换为 0。

3.3 添加总计

我们可以使用 margins=True 参数来添加行和列的总计。

pivot_table = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc='sum', fill_value=0, margins=True, margins_name='Total') print(pivot_table)

输出:

Product A B Total Region North 330 0 330 South 0 490 490 Total 330 490 820

现在,透视表包含了每个区域和产品的总销售额,以及所有区域和产品的总销售额。 margins_name 参数允许我们自定义总计行的名称。

3.4 使用多个聚合函数

我们可以使用多个聚合函数来同时计算不同的统计量。

pivot_table = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc=['sum', 'mean', 'count'], fill_value=0) print(pivot_table)

输出:

sum mean count Product A B A B A B Region North 330 0 110.0 0.0 3 0 South 0 490 0.0 163.333 0 3

在这个例子中,我们同时计算了销售额的总和、平均值和计数。

3.5 使用多个索引和列

我们可以使用多个列作为索引或列标签。

pivot_table = pd.pivot_table(df, values='Sales', index=['Date', 'Region'], columns='Product', aggfunc='sum', fill_value=0) print(pivot_table)

输出:

Product A B Date Region 2023-01-01 North 100 0 South 0 150 2023-01-02 North 120 0 South 0 180 2023-01-03 North 110 0 South 0 160

在这个例子中,我们使用 'Date' 和 'Region' 作为行索引。

3.6 使用自定义聚合函数

我们可以使用自定义函数进行聚合。

def sales_range(x): return x.max() - x.min() pivot_table = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc=sales_range, fill_value=0) print(pivot_table)

输出:

Product A B Region North 20 0 South 0 30

在这个例子中,我们定义了一个名为 sales_range 的函数,用于计算销售额的范围(最大值 - 最小值)。

4. 透视表的工作原理

从逻辑上讲,pivot_table 函数执行以下步骤:

  1. 分组: 根据 indexcolumns 参数对数据进行分组。

  2. 聚合: 对每个分组中的 values 列应用 aggfunc 函数进行聚合。

  3. 重塑: 将聚合后的数据重塑为一个新的 DataFrame,其中 index 列成为行索引,columns 列成为列标签。

5. 透视表的应用场景

透视表在数据分析中有着广泛的应用,以下是一些常见的场景:

  • 销售分析: 按地区、产品、时间段等维度分析销售额、利润等指标。

  • 市场营销分析: 按客户群体、渠道、活动等维度分析营销效果。

  • 客户行为分析: 按客户属性、购买行为等维度分析客户价值。

  • 财务分析: 按科目、部门、时间段等维度分析财务数据。

  • 风险管理: 按风险类型、业务部门等维度分析风险敞口。

6. 透视表与分组 (groupby) 的区别

虽然 pivot_tablegroupby 都可以用于数据聚合,但它们之间存在一些关键区别:

  • 输出格式: pivot_table 的输出是一个重塑后的 DataFrame,具有清晰的行索引和列标签,更易于阅读和分析。groupby 的输出是一个 GroupBy 对象,需要进一步处理才能得到最终结果。

  • 功能: pivot_table 专注于数据的重塑和聚合,而 groupby 更加灵活,可以进行更复杂的数据转换和分析。

  • 适用场景: pivot_table 适用于需要对数据进行多维度汇总和分析的场景,而 groupby 适用于需要进行更精细的数据处理和转换的场景。

7. 使用 Mermaid 图表理解透视表

我们可以使用 Mermaid 图表来可视化透视表的操作过程。

这个图表展示了透视表的基本流程:

  1. 从原始数据开始。

  2. 根据指定的 indexcolumns 参数对数据进行分组。

  3. 使用 aggfunc 参数指定的聚合函数对每个组进行聚合。

  4. 生成最终的透视表,一个重塑后的 DataFrame。

  5. 最后,可以对透视表进行分析和可视化。

8. 总结

pivot_table 是 Pandas 中一个强大的数据聚合工具,它可以帮助我们从不同的角度审视数据,揭示隐藏的模式和关系。通过灵活地组合 indexcolumnsvaluesaggfunc 参数,我们可以生成各种各样的透视表,以满足不同的分析需求。 掌握 pivot_table 的使用方法,能够极大地提高数据分析的效率和质量。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U