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

pd.DataFrame.stack为何远慢于numpy.flatten?提速方法解析

pandas.DataFrame.stack 比 numpy.flatten 慢的原因及提速方案

为什么 stack() 更慢?

  • 功能量级完全不同:numpy.flatten() 只是单纯把多维数组展平成一维,本质是内存层面的连续化操作(要么返回视图要么浅拷贝),几乎没有额外逻辑。而 df.stack() 不仅要展平数据,还要为结果生成MultiIndex——它会把原DataFrame的行、列索引组合成层级索引,最终返回带完整索引信息的Series。索引的构造、对齐和绑定,这些都是额外的计算开销,也是慢的核心原因。
  • pandas对象的封装开销:numpy操作贴近底层,直接对数组内存块操作;而pandas的Series需要处理类型校验、数据结构封装等通用逻辑,哪怕你的数据是单一的float64,这些额外的封装步骤也会消耗时间。
  • 内存操作差异:df.values.flatten() 直接操作原DataFrame对应的numpy数组,若原数组内存连续,操作效率极高;而 stack() 在生成Series时,需要重新组织数据和索引的内存结构,涉及更多内存分配与拷贝。

提速方法

根据你的实际需求选择:

  • 直接用numpy展平(最快方案):如果不需要保留索引信息,直接用 df.values.flatten() 或 df.to_numpy().flatten(),完全复用numpy的底层高效操作,这是最优解。
  • 用melt()替代(需保留部分索引):如果需要保留行索引并将列转为变量列,melt() 在多数场景下比 stack() 更快,适合不需要MultiIndex的情况。
  • 简化索引减少开销:如果必须用stack(),先把原DataFrame的索引换成简单的整数索引(避免字符串、datetime等复杂索引类型),能降低索引构造的计算成本。
  • 特定场景用explode():如果是要把每行的元素拆成多行,explode() 在某些情况下效率更高,但只适用于行内元素是可迭代对象的场景。

测试数据参考

df.shape    # dtype = float64
(2578, 809)
%timeit df.stack()
42 ms ± 130 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df.values.flatten()
7.35 ms ± 17.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:59:59