You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中构建3维DataFrame及实现heat_map()的问题求助

嘿,我来帮你搞定这个3维DataFrame的构建问题,顺便教你怎么画对应的热力图!

一、先明确:Pandas里没有真正的3D DataFrame

首先得纠正一个常见误区——pandas本身并没有原生的3维DataFrame结构哦!之前很多人用的Panel类早就被弃用了(pandas 0.25版本之后就移除了),现在官方推荐用多层索引(MultiIndex)的2D DataFrame来模拟3维数据,这大概率是你之前出错的原因:要么误用了已废弃的Panel,要么试图直接创建3D结构但找错了方法。

二、正确构建“3维”数据的两种方式

1. 用MultiIndex构建(Pandas官方推荐)

我们可以把第三个维度嵌套进行或列的多层索引里,比如假设你要存储「日期-产品类别-区域」三个维度的销售额数据,示例代码如下:

import pandas as pd
import numpy as np

# 定义三个维度的取值
dates = pd.date_range('2024-01-01', periods=3)  # 日期维度:3天
categories = ['Electronics', 'Clothing']        # 类别维度:2类
regions = ['North', 'South']                    # 区域维度:2个区域

# 生成多层列索引(把类别+区域作为列的两层索引)
multi_columns = pd.MultiIndex.from_product(
    [categories, regions], 
    names=['Category', 'Region']
)

# 构建带多层索引的DataFrame(模拟3维数据)
df_3d = pd.DataFrame(
    np.random.randn(3, 4),  # 3行(日期)×4列(2类别×2区域),形状匹配索引乘积
    index=dates,
    columns=multi_columns
)

print(df_3d)

这样的结构既能存储3维数据,又能享受pandas所有的数据分析功能,不会出现废弃类的错误。

2. 用Xarray构建纯粹的3D数据结构

如果你确实需要更原生的多维数组支持,可以用专门处理多维数据的xarray库,它和pandas兼容性很好:

import xarray as xr

# 创建3D数据集
ds = xr.Dataset(
    {
        'sales': (['date', 'category', 'region'], np.random.randn(3, 2, 2))
    },
    coords={
        'date': dates,
        'category': categories,
        'region': regions
    }
)

print(ds)
三、绘制热力图(Heatmap)

热力图本质是2D可视化,所以我们需要把3D数据降维——固定其中一个维度,绘制剩下两个维度的热力图,下面分两种情况演示:

1. 基于MultiIndex DataFrame的热力图(用Seaborn)

比如我们固定某一天,绘制「类别×区域」的销售额热力图:

import seaborn as sns
import matplotlib.pyplot as plt

# 提取2024-01-01的数据,转成普通2D DataFrame
single_day_data = df_3d.loc['2024-01-01'].unstack()

# 绘制热力图
plt.figure(figsize=(8, 4))
sns.heatmap(single_day_data, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Sales Heatmap on 2024-01-01')
plt.show()

如果想一次性展示所有日期的热力图,可以用子图批量绘制:

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
for idx, date in enumerate(dates):
    # 提取单天数据并转成2D结构
    day_data = df_3d.loc[date].unstack()
    # 在子图上画热力图
    sns.heatmap(day_data, annot=True, cmap='coolwarm', ax=axes[idx], cbar=False, fmt='.2f')
    axes[idx].set_title(f'Sales on {date.date()}')
plt.tight_layout()
plt.show()

2. 基于Xarray的热力图

Xarray自带绘图功能,操作更简洁:

# 固定日期,绘制类别×区域的热力图
ds.sel(date='2024-01-01')['sales'].plot(kind='heatmap', annot=True, cmap='coolwarm')
plt.title('Sales Heatmap on 2024-01-01')
plt.show()
四、你可能遇到的错误排查

如果之前构建时出现错误,大概率是这两种情况:

  • 误用Panel类:报错AttributeError: module 'pandas' has no attribute 'Panel',直接换成上面的MultiIndex方法即可。
  • 维度不匹配:报错ValueError: Shape of passed values is ..., indices imply ...,检查数据的形状和多层索引的乘积是否一致(比如3天×2类别×2区域对应3行×4列的DataFrame,数据总个数要匹配)。

内容的提问来源于stack exchange,提问作者hongyan2003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:31:49