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

使用pandas.to_numeric结合apply()时datetime索引内存异常升高

问题:使用apply()转型列后Datetime索引内存暴涨的原因

我按照pandas文档示例尝试向下转型数据类型以降低内存占用,尝试将带datetime索引的DataFrame中两列从float64转为float32:

构建测试DataFrame

import pandas as pd # version: 1.3.5
import numpy as np # version: 1.21.5
df = pd.DataFrame(np.random.uniform(50, 100, size=(200, 2)), columns=['x','y'],
                                    index=pd.date_range("2022-01-01", periods=200, freq="H"))

初始内存:索引占1600字节,x、y列各占1600字节。

单独列转型操作

df['x'] = pd.to_numeric(df['x'], downcast='float')
df['y'] = pd.to_numeric(df['y'], downcast='float')

此时x、y转为float32,各占800字节内存,索引内存仍为1600字节,符合预期。

使用apply()转型操作

df[['x','y']] = df[['x','y']].apply(pd.to_numeric, downcast='float')

x、y成功转为float32,但datetime索引内存增至9896字节,是原来的6倍多。请问该现象的原因是什么?


原因分析

这个问题的核心是apply()方法的执行逻辑导致索引类型被隐式转换:

  • df[['x','y']].apply(pd.to_numeric, downcast='float')会生成一个全新的DataFrame,这个新DataFrame的索引会被转换为Python原生datetime对象组成的object数组,而非原DataFrame中紧凑的datetime64[ns]类型。
  • 原索引的datetime64[ns]类型每个元素仅占8字节,200个元素总计1600字节;而object类型索引中的每个Python datetime对象包含对象头、指针等额外开销,单元素内存占用远高于8字节,200个对象总计约9896字节。
  • 当执行df[['x','y']] = ...赋值时,pandas会将新DataFrame的索引同步到原DataFrame,直接替换了原有的紧凑索引,最终导致索引内存暴涨。

而单独对列赋值的方式df['x'] = pd.to_numeric(...)是直接在原列上修改数据类型,不会触发索引的重构或替换,因此索引保持原类型和内存占用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:20:27