pandas内存占用高因默认使用宽类型(如int64/float64),而实际数据范围小;应检查取值范围后降级为最小合适类型(如int8/int16/int8/float32),注意nan、id列和category类型适用场景。

为什么df.info()显示内存用了2GB,但实际数据没那么多?
因为Pandas默认用int64和float64存所有数值列,哪怕你只存0–100的整数或小数点后两位的价格。64位类型占8字节/值,而int8只要1字节——差8倍。内存暴涨往往不是数据量大,而是类型“过度宽裕”。
- 先用
df.memory_usage(deep=True).sum()确认真实内存占用(deep=True才计入字符串等对象内部) - 再用
df.dtypes看哪些列是int64/float64但实际取值范围很小 - 特别注意从CSV读入时未指定
dtype,Pandas会保守推断为最宽类型
怎么安全地把int64降级到int32或int8?
不能直接astype('int8')——万一有超范围值就报错或静默溢出。得先检查取值范围,再选最小够用的类型。
- 对每列整数:用
df[col].min()和df[col].max()确定区间 - 对照选择:
int8(-128~127)、int16(-32768~32767)、int32(约±21亿) - 执行降级:
df[col] = df[col].astype('int16'),注意别在原地链式赋值(如df[col].astype().copy()不生效) - 如果含缺失值(
NaN),普通int类型不支持,得用可空类型:Int8、Int16(首字母大写,Pandas 0.24+)
float64能换成float32吗?要注意什么?
可以,且通常最安全——float32精度约7位有效数字,对大多数业务数据(价格、评分、温度)完全够用,内存直接减半。
- 先确认无高精度科学计算需求(比如金融风控里某些累计误差敏感场景)
- 检查是否有
inf或-inf:float32表示范围比float64小,极端值可能变inf - 执行:
df.select_dtypes(include=['float64']).columns找出目标列,逐个astype('float32') - 字符串转浮点时也建议加
dtype={'price': 'float32'}进pd.read_csv(),省得后续再转
一行代码自动优化所有数值列?小心这些坑
网上流传的“自动降级函数”容易翻车——它常忽略缺失值处理、类别混淆、或误把ID列当普通整数压成int8(ID=1000000000会被截断)。
- 别无脑跑
pd.to_numeric(df[col], downcast='integer'):它对含NaN的列会强制转成float64,反而更费内存 - ID类列(即使全是整数)应保留
object或显式转string,避免数值运算误伤 - 分类少、重复多的整数列(如状态码0/1/2),优先考虑
'category'类型,比任何数值类型都省空间 - 真正想批量处理,建议封装逻辑:先
select_dtypes分组,再按列内容特征(是否含NaN、是否离散、是否ID)分支处理
类型降级不是越低越好,关键在匹配数据语义。一个被当成int8的用户年龄列,遇到150岁数据就崩;一个该用category的渠道来源列,硬塞int16反而失去快速分组优势。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











