df.info()显示内存远高于实际数据大小,因Pandas默认用int64/float64/object存储,如int64每值占8字节而int8仅1字节;含NaN时需用Int32等可空类型,数值列应优先用pd.to_numeric(…, downcast=…)安全降级,字符串列则依唯一值比例决定是否转category。

为什么 df.info() 显示内存使用远高于实际数据大小?
这是因为 pandas 默认用 int64、float64 和 object 类型存储列,尤其 object 列(如字符串)会为每个元素单独分配内存,且不共享引用。即使全是小整数,int64 也占 8 字节——而 int8 只要 1 字节。
如何用 pd.to_numeric() 和 astype() 安全降级数值类型?
直接写 df[col].astype('int32') 很危险:若列含 NaN,int32 不支持,会报 ValueError: cannot convert float NaN to integer。必须先处理缺失值或改用可空类型。
- 对数值列,优先用
pd.to_numeric(df[col], downcast='integer')或downcast='signed'/'unsigned'/'float',它自动选最小可行类型(如把int64→int32→int16) - 含
NaN的整数列,改用Int32(首字母大写),这是 pandas 的可空整数类型:df[col].astype('Int32') - 浮点列若精度允许,用
df[col].astype('float32')—— 内存减半,多数场景无感知损失
字符串列怎么压缩?别只想着 category
astype('category') 对重复值多的字符串列(如状态码、地区名)极有效,但对唯一值接近行数的列(如 UUID、长文本)反而更占内存,因为 category 需额外维护 codes + categories 映射表。
- 先检查唯一值比例:
df[col].nunique() / len(df),category - 避免对整个
object列批量转 category —— 先select_dtypes('object'),再逐列评估 - 如果字符串有前缀/后缀规律(如
"user_123","user_456"),提取关键字段(如df[col].str.replace('user_', '').astype('uint32'))比留字符串高效得多
读取阶段就控制内存:用 dtype 和 usecols 参数
等数据加载完再压缩,已经浪费了内存峰值。真正低内存环境必须在 pd.read_csv() 等读取时就干预。
立即学习“Python免费学习笔记(深入)”;
- 用
usecols只读需要的列,避免载入冗余字段 - 用
dtype字典预设类型,例如:{'user_id': 'uint32', 'status': 'category', 'score': 'float32'} - 对大 CSV,配合
chunksize分块处理,每块压缩后再拼接,防止单次加载爆内存
类型选错比不压缩更糟——比如把可能超范围的 ID 强制设成 uint16,后续计算会静默溢出。务必核对原始数据分布再 downcast。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/shoujipingce/125678.html