现在位置: 首页 > Pandas 教程 > 正文

Pandas df.pivot() 函数

Pandas 常用函数 Pandas 常用函数


df.pivot() 是 DataFrame 的成员方法,用于创建透视表。它可以根据指定的行索引、列索引和值列,将数据重塑为新的布局形式。

pivot_table() 不同,pivot() 不支持聚合操作,要求行索引和列索引的组合是唯一的,否则会抛出错误。

单词释义pivot 意为"旋转、枢轴",这里指数据的"旋转"重塑,像Pivot表一样可以动态切换行列维度。


基本语法与参数

df.pivot() 是 DataFrame 的实例方法,通过点运算符调用。

语法格式

DataFrame.pivot(index=None, columns, values=None)

参数说明

  • 参数index
    • 类型: 列名、标签、标签列表或 None。
    • 描述: 用作新 DataFrame 行索引的列。如果为 None,则使用现有的行索引。
  • 参数columns
    • 类型: 列名或标签。
    • 描述: 必填参数。用作新 DataFrame 列索引的列,用于将唯一值展开为列名。
  • 参数values
    • 类型: 列名、标签、标签列表或 None。
    • 描述: 用于填充 DataFrame 的数据列。如果不指定,则使用除 index 和 columns 外的所有列。

函数说明

  • 返回值: 返回一个新的 DataFrame,即透视表。
  • 限制: 如果 index 和 columns 的组合存在重复值,会抛出 ValueError。这种情况下应使用 pivot_table(),它会自动进行聚合。

实例

让我们通过一系列从简单到复杂的例子,彻底掌握 df.pivot() 的用法。

示例 1:基础用法 - 创建简单透视表

实例

import pandas as pd

# 1. 创建销售数据(每行一个产品-地区-销售额的组合)
sales = pd.DataFrame({
    'product': ['A', 'A', 'B', 'B', 'C', 'C'],
    'region': ['North', 'South', 'North', 'South', 'North', 'South'],
    'sales': [100, 150, 200, 180, 220, 250]
})

print("=== 原始销售数据 ===")
print(sales)

# 2. 使用 df.pivot() 创建透视表
# 行索引:product,列索引:region,值:sales
pivot_result = sales.pivot(index='product', columns='region', values='sales')
print("n=== df.pivot() 透视表 ===")
print(pivot_result)

运行结果预期:

=== 原始销售数据 ===
  product  region  sales
0       A   North    100
1       A   South    150
2       B   North    200
3       B   South    180
4       C   North    220
5       C   South    250

=== df.pivot() 透视表 ===
region   North  South
product
A         100    150
B         200    180
C         220    250

代码解析:

  1. 原始数据是长格式,每行记录一个产品在某个地区的销售额。
  2. pivot() 将 product 列作为行索引,region 列作为列索引,sales 作为值。
  3. 结果是一个清晰的二维表格,可以直观比较不同产品在不同地区的销售情况。

示例 2:多列值 - 同时透视多个指标

可以同时透视多个数值列,获得更丰富的数据视图。

实例

import pandas as pd

# 1. 创建包含销售额和数量的数据
sales = pd.DataFrame({
    'product': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B'],
    'region': ['North', 'South', 'North', 'South', 'East', 'West', 'East', 'West'],
    'sales': [100, 150, 200, 180, 120, 130, 190, 210],
    'quantity': [10, 15, 20, 18, 12, 13, 19, 21]
})

print("=== 原始数据 ===")
print(sales)

# 2. 只透视销售额
print("n=== 销售额透视表 ===")
sales_pivot = sales.pivot(index='product', columns='region', values='sales')
print(sales_pivot)

# 3. 透视销售额和数量(不指定values,使用所有数值列)
print("n=== 多指标透视 ===")
multi_pivot = sales.pivot(index='product', columns='region')
print(multi_pivot)

运行结果预期:

=== 原始数据 ===
  product  region  sales  quantity
0       A   North    100         10
1       A   South    150         15
2       B   North    200         20
3       B   South    180         18
4       A   East    120         12
5       A   West    130         13
6       B   East    190         19
7       B   West    210         21

=== 销售额透视表 ===
region   East  North  South  West
product
A         120    100    150   130
B         190    200    180   210

=== 多指标透视 ===
         sales              quantity
region   East North South West  East North South West
product
A         120  100   150  130     12    10    15   13
B         190  200   180  210     19    20    18   21

代码解析:

  • 不指定 values 参数时,会使用除 index 和 columns 外的所有列。
  • 多列透视会产生多层列索引,第一层是原始列名,第二层是 columns 参数的值。
  • 这种方法便于同时对比多个指标在不同维度下的表现。

示例 3:多层索引 - 使用多个列作为行索引

可以使用多个列创建具有层次化索引的透视表。

实例

import pandas as pd

# 1. 创建包含年份、季度、产品信息的数据
data = pd.DataFrame({
    'year': [2023, 2023, 2023, 2023, 2024, 2024, 2024, 2024],
    'quarter': ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q1', 'Q2', 'Q2'],
    'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
    'sales': [100, 150, 200, 180, 220, 250, 230, 270]
})

print("=== 原始数据 ===")
print(data)

# 2. 使用多个列作为行索引(列表形式)
print("n=== 多层行索引透视 ===")
pivot_multi = data.pivot(index=['year', 'quarter'], columns='product', values='sales')
print(pivot_multi)

# 3. 重置索引,转换为普通DataFrame
print("n=== 重置索引后 ===")
pivot_reset = pivot_multi.reset_index()
print(pivot_reset)

运行结果预期:

=== 原始数据 ===
   year quarter product  sales
0  2023      Q1       A    100
1  2023      Q1       B    150
值会抛出错误
- 这是 pivot() 和 pivot_table() 的关键区别:pivot() 要求数据唯一性,pivot_table() 会自动聚合重复值

代码解析:

  • 通过 index=['year', 'quarter'] 可以创建具有多层行索引的透视表。
  • 这种格式便于按时间维度分析不同产品的表现。
  • 使用 reset_index() 可以将层次化索引转换回普通列。

注意: 如果原始数据中存在相同的 index + columns 组合,pivot() 会抛出 ValueError: Index contains duplicate entries。此时应使用 pivot_table(),它会自动对重复值进行聚合。

Pandas 常用函数 Pandas 常用函数