本文目录导读:

在Python中实现数据透视表,最常用的是pandas库的pivot_table函数,以下是完整的实现案例:
基础案例
import pandas as pd
import numpy as np
# 创建示例数据
data = {
'日期': ['2024-01-01', '2024-01-01', '2024-01-02', '2024-01-02', '2024-01-03'],
'产品': ['A', 'B', 'A', 'B', 'A'],
'地区': ['华北', '华东', '华北', '华东', '华北'],
'销售额': [100, 200, 150, 250, 300],
'数量': [10, 20, 15, 25, 30]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
创建数据透视表
# 基本数据透视表
pivot_table = pd.pivot_table(
df,
values='销售额', # 要聚合的值
index='日期', # 行索引
columns='产品', # 列索引
aggfunc='sum' # 聚合函数
)
print("\n基本数据透视表:")
print(pivot_table)
多维度数据透视表
# 多维度数据透视表
pivot_multi = pd.pivot_table(
df,
values=['销售额', '数量'],
index=['日期', '地区'],
columns='产品',
aggfunc='sum',
fill_value=0 # 填充缺失值为0
)
print("\n多维数据透视表:")
print(pivot_multi)
多种聚合函数
# 使用多种聚合函数
pivot_agg = pd.pivot_table(
df,
values='销售额',
index='产品',
columns='地区',
aggfunc=['sum', 'mean', 'count', 'max']
)
print("\n多种聚合函数:")
print(pivot_agg)
添加总计和小计
# 添加总计和小计
pivot_margins = pd.pivot_table(
df,
values='销售额',
index='产品',
columns='地区',
aggfunc='sum',
margins=True, # 显示总计
margins_name='总计' # 总计的名称
)
print("\n带总计的数据透视表:")
print(pivot_margins)
实际案例分析
# 创建更复杂的数据集
np.random.seed(42)
sales_data = pd.DataFrame({
'日期': pd.date_range('2024-01-01', periods=30, freq='D'),
'产品': np.random.choice(['A', 'B', 'C'], 30),
'地区': np.random.choice(['华北', '华东', '华南', '西南'], 30),
'销售额': np.random.randint(100, 1000, 30),
'利润': np.random.randint(10, 100, 30),
'销售员': np.random.choice(['张三', '李四', '王五'], 30)
})
print("\n销售数据样例:")
print(sales_data.head())
# 创建月度、产品、地区的销售额汇总
sales_pivot = pd.pivot_table(
sales_data,
values='销售额',
index='地区',
columns='产品',
aggfunc='sum',
margins=True,
fill_value=0
)
print("\n各地区各产品销售总额:")
print(sales_pivot)
# 按销售员和地区统计销售额和利润
sales_employee = pd.pivot_table(
sales_data,
values=['销售额', '利润'],
index='销售员',
columns='地区',
aggfunc={'销售额': 'sum', '利润': 'mean'},
fill_value=0
)
print("\n各销售员在不同地区的表现:")
print(sales_employee)
高级用法 - 自定义聚合函数
# 自定义聚合函数
def range_func(x):
"""计算范围(最大值-最小值)"""
return x.max() - x.min()
pivot_custom = pd.pivot_table(
sales_data,
values='销售额',
index='产品',
columns='地区',
aggfunc=[np.sum, np.mean, range_func]
)
print("\n自定义聚合函数:")
print(pivot_custom)
数据透视表的可视化
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建数据透视表并可视化
pivot_visual = pd.pivot_table(
sales_data,
values='销售额',
index='产品',
columns='地区',
aggfunc='sum',
fill_value=0
)
# 热力图展示
plt.figure(figsize=(10, 6))
sns.heatmap(pivot_visual, annot=True, fmt='.0f', cmap='YlOrRd')'各地区产品销售热力图')
plt.show()
# 柱状图展示
pivot_visual.plot(kind='bar', figsize=(12, 6))'各产品销售对比')
plt.xlabel('产品')
plt.ylabel('销售额')
plt.legend(title='地区')
plt.xticks(rotation=0)
plt.show()
完整的实用函数
def create_sales_pivot(dataframe, value_col='销售额',
index_cols=['地区'],
columns_cols=['产品'],
agg_func='sum'):
"""
创建销售数据透视表的通用函数
参数:
dataframe: 数据框
value_col: 值列名
index_cols: 行索引列列表
columns_cols: 列索引列列表
agg_func: 聚合函数
返回:数据透视表
"""
try:
pivot = pd.pivot_table(
data=dataframe,
values=value_col,
index=index_cols,
columns=columns_cols,
aggfunc=agg_func,
fill_value=0,
margins=True,
margins_name='合计'
)
return pivot
except Exception as e:
print(f"创建数据透视表时出错:{e}")
return None
# 使用示例
result = create_sales_pivot(sales_data)
print("\n通用函数创建的数据透视表:")
print(result)
pandas的pivot_table函数提供了强大的数据透视功能:
- index: 行索引
- columns: 列索引
- values: 要聚合的值
- aggfunc: 聚合函数(sum, mean, count, max, min等)
- fill_value: 填充缺失值
- margins: 是否显示总计
通过这些功能,你可以轻松实现类似于Excel数据透视表的分析功能。