5.3 透视表 (pivottable) Pandas 透视表 (pivottable) 详解:数据聚合与分组的利器 透视表的基本概念 透视表的核心思想是将数据表中的行和列进行重新排列,并对特定单元格的数据进行聚合计算。它允许我们: 选择索引 (index): 将一列或多列的值作为新的行索引。 选择列 (columns): 将一列或多列的值作为新的列标签。 选择值 (values): 将一列或多列的值作为要聚合的数据。 定义聚合函数 (aggfunc): 指定如何对值进行聚合,例如求和、平均值、计数等。 通过灵活地组合这些参数,我们可以生成各种各样的透视表,以满足不同的分析需求。 函数的语法 函数的基本语法如下: 各个参数的含义如下: : 要进行透视的数据框 (DataFrame)。
透视表的核心思想是将数据表中的行和列进行重新排列,并对特定单元格的数据进行聚合计算。它允许我们:
选择索引 (index): 将一列或多列的值作为新的行索引。
选择列 (columns): 将一列或多列的值作为新的列标签。
选择值 (values): 将一列或多列的值作为要聚合的数据。
定义聚合函数 (aggfunc): 指定如何对值进行聚合,例如求和、平均值、计数等。
通过灵活地组合这些参数,我们可以生成各种各样的透视表,以满足不同的分析需求。
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: 是否对结果进行排序。
为了更好地理解 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
我们首先创建一个简单的透视表,按区域和产品汇总销售额。
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 值,这表示在特定区域没有销售特定产品。
我们可以使用 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。
我们可以使用 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 参数允许我们自定义总计行的名称。
我们可以使用多个聚合函数来同时计算不同的统计量。
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
在这个例子中,我们同时计算了销售额的总和、平均值和计数。
我们可以使用多个列作为索引或列标签。
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' 作为行索引。
我们可以使用自定义函数进行聚合。
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 的函数,用于计算销售额的范围(最大值 - 最小值)。
从逻辑上讲,pivot_table 函数执行以下步骤:
分组: 根据 index 和 columns 参数对数据进行分组。
聚合: 对每个分组中的 values 列应用 aggfunc 函数进行聚合。
重塑: 将聚合后的数据重塑为一个新的 DataFrame,其中 index 列成为行索引,columns 列成为列标签。
透视表在数据分析中有着广泛的应用,以下是一些常见的场景:
销售分析: 按地区、产品、时间段等维度分析销售额、利润等指标。
市场营销分析: 按客户群体、渠道、活动等维度分析营销效果。
客户行为分析: 按客户属性、购买行为等维度分析客户价值。
财务分析: 按科目、部门、时间段等维度分析财务数据。
风险管理: 按风险类型、业务部门等维度分析风险敞口。
虽然 pivot_table 和 groupby 都可以用于数据聚合,但它们之间存在一些关键区别:
输出格式: pivot_table 的输出是一个重塑后的 DataFrame,具有清晰的行索引和列标签,更易于阅读和分析。groupby 的输出是一个 GroupBy 对象,需要进一步处理才能得到最终结果。
功能: pivot_table 专注于数据的重塑和聚合,而 groupby 更加灵活,可以进行更复杂的数据转换和分析。
适用场景: pivot_table 适用于需要对数据进行多维度汇总和分析的场景,而 groupby 适用于需要进行更精细的数据处理和转换的场景。
我们可以使用 Mermaid 图表来可视化透视表的操作过程。
这个图表展示了透视表的基本流程:
从原始数据开始。
根据指定的 index 和 columns 参数对数据进行分组。
使用 aggfunc 参数指定的聚合函数对每个组进行聚合。
生成最终的透视表,一个重塑后的 DataFrame。
最后,可以对透视表进行分析和可视化。
pivot_table 是 Pandas 中一个强大的数据聚合工具,它可以帮助我们从不同的角度审视数据,揭示隐藏的模式和关系。通过灵活地组合 index、columns、values 和 aggfunc 参数,我们可以生成各种各样的透视表,以满足不同的分析需求。 掌握 pivot_table 的使用方法,能够极大地提高数据分析的效率和质量。