Python案例如何用Pandas做数据分组热图

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据分组热图

  1. 基础数据准备
  2. 案例1:地区×产品的销售额热图
  3. 案例2:季度×地区的利润分布热图
  4. 案例3:多级分组热图
  5. 案例4:相关性热图
  6. 案例5:批量分组统计热图
  7. 案例6:标准化热图(归一化)
  8. 高级技巧

我来介绍如何使用Pandas和Seaborn做数据分组热图(Heatmap),这里有几个常见案例:

基础数据准备

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42)
data = pd.DataFrame({
    '地区': np.random.choice(['华北', '华东', '华南', '西南'], 100),
    '产品': np.random.choice(['A', 'B', 'C', 'D'], 100),
    '季度': np.random.choice(['Q1', 'Q2', 'Q3', 'Q4'], 100),
    '销售额': np.random.randint(100, 1000, 100),
    '利润': np.random.randint(10, 200, 100)
})
print("原始数据前5行:")
print(data.head())

案例1:地区×产品的销售额热图

# 使用pivot_table创建透视表
pivot_sales = pd.pivot_table(data, 
                            values='销售额',
                            index='地区', 
                            columns='产品',
                            aggfunc='mean',
                            fill_value=0)
print("销售额透视表:")
print(pivot_sales)
# 绘制热图
plt.figure(figsize=(8, 6))
sns.heatmap(pivot_sales, 
            annot=True,  # 显示数值
            fmt='.0f',   # 数值格式
            cmap='YlOrRd', # 颜色映射
            linewidths=0.5)'各地区不同产品平均销售额热图')
plt.tight_layout()
plt.show()

案例2:季度×地区的利润分布热图

# 创建季度和地区的利润汇总
pivot_profit = data.groupby(['季度', '地区'])['利润'].mean().unstack()
print("利润透视表:")
print(pivot_profit)
# 绘制热图
plt.figure(figsize=(8, 6))
sns.heatmap(pivot_profit,
            annot=True,
            fmt='.1f',
            cmap='RdYlGn',  # 红黄绿色阶
            center=50,      # 居中值
            linewidths=1,
            linecolor='white')'各季度不同地区平均利润分布')
plt.show()

案例3:多级分组热图

# 创建更复杂的分组
pivot_multi = data.groupby(['地区', '季度'])['销售额'].mean().unstack(level='季度')
print("多级分组数据:")
print(pivot_multi)
# 绘制美观的热图
plt.figure(figsize=(10, 8))
sns.heatmap(pivot_multi,
            annot=True,
            fmt='.0f',
            cmap='coolwarm',
            center=pivot_multi.mean().mean(),
            linewidths=0.5,
            cbar_kws={'label': '平均销售额'})'各地区不同季度销售表现')
plt.xlabel('季度')
plt.ylabel('地区')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

案例4:相关性热图

# 计算数值列的相关性
numeric_cols = data.select_dtypes(include=[np.number]).columns
corr_matrix = data[numeric_cols].corr()
print("相关系数矩阵:")
print(corr_matrix)
# 绘制相关性热图
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix,
            annot=True,
            fmt='.2f',
            cmap='RdBu',
            center=0,
            vmin=-1,
            vmax=1,
            square=True,  # 正方形格子
            mask=np.triu(np.ones_like(corr_matrix, dtype=bool)))  # 显示下半三角'数值变量相关性热图')
plt.tight_layout()
plt.show()

案例5:批量分组统计热图

def create_group_heatmap(data, index_col, columns_col, value_col, 
                        aggfunc='mean', title='分组热图'):
    """创建分组热图的通用函数"""
    # 创建透视表
    pivot = pd.pivot_table(data,
                          values=value_col,
                          index=index_col,
                          columns=columns_col,
                          aggfunc=aggfunc,
                          fill_value=0)
    print(f"透视表 ({index_col} × {columns_col}):")
    print(pivot)
    print("\n")
    # 绘制热图
    plt.figure(figsize=(10, 6))
    sns.heatmap(pivot,
                annot=True,
                fmt='.1f',
                cmap='YlOrRd',
                linewidths=1,
                cbar_kws={'label': f'平均{value_col}'})
    plt.title(title)
    plt.xlabel(columns_col)
    plt.ylabel(index_col)
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.show()
    return pivot
# 使用通用函数创建不同热图
create_group_heatmap(data, '地区', '产品', '销售额', 
                     title='各地区-产品销售额分布')
create_group_heatmap(data, '季度', '产品', '利润',
                     title='各季度-产品利润分布')

案例6:标准化热图(归一化)

# 创建地区产品销售额透视表
pivot_raw = pd.pivot_table(data,
                          values='销售额',
                          index='地区',
                          columns='产品',
                          aggfunc='mean',
                          fill_value=0)
# 行归一化(按地区)
pivot_row_norm = pivot_raw.div(pivot_raw.sum(axis=1), axis=0)
print("行归一化数据(每个地区产品占比):")
print(pivot_row_norm)
# 绘制归一化热图
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
# 原始值热图
sns.heatmap(pivot_raw, annot=True, fmt='.0f', 
            cmap='Blues', ax=axes[0])
axes[0].set_title('原始销售额')
# 归一化热图
sns.heatmap(pivot_row_norm, annot=True, fmt='.1%',
            cmap='Greens', ax=axes[1])
axes[1].set_title('各产品销售占比(按地区)')
plt.tight_layout()
plt.show()

高级技巧

# 8.1 自定义颜色和格式
def custom_heatmap(pivot_data, title="自定义热图"):
    plt.figure(figsize=(10, 8))
    ax = sns.heatmap(pivot_data,
                    annot=True,
                    fmt='.0f',
                    cmap=sns.color_palette("viridis", as_cmap=True),
                    annot_kws={'size': 10, 'weight': 'bold'},
                    cbar_kws={'shrink': 0.8},
                    linewidth=2,
                    linecolor='white')
    plt.title(title, fontsize=16, fontweight='bold')
    plt.tight_layout()
    return ax
# 8.2 网格数据的分组分析
pivot_grid = data.groupby(['地区', '季度', '产品'])['销售额'].sum()
pivot_simple = pivot_grid.groupby(level=['地区', '季度']).mean().unstack()
print("网格分组数据:")
print(pivot_simple)
custom_heatmap(pivot_simple, "地区×季度平均销售额热图")

核心步骤:

  1. 数据准备:使用Pandas分组聚合
  2. 透视转换:用pivot_table()groupby().unstack()
  3. 可视化:用Seaborn的heatmap()
  4. 美化:调整颜色、标签、格式等

常用功能:

  • annot=True: 显示数值
  • fmt: 数值格式 ('.0f', '.1%'等)
  • cmap: 颜色映射
  • center: 颜色居中值
  • mask: 矩阵遮罩

这种热图特别适合展示类别变量之间的数值分布或相关性!

抱歉,评论功能暂时关闭!