Pandas df.pivot() 函数
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)
# 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
代码解析:
- 原始数据是长格式,每行记录一个产品在某个地区的销售额。
pivot()将 product 列作为行索引,region 列作为列索引,sales 作为值。- 结果是一个清晰的二维表格,可以直观比较不同产品在不同地区的销售情况。
示例 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)
# 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)
# 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 常用函数