最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在Python中对DataFrame进行内存压缩来适应低内存服务器环境?
时间:2026-07-27 18:19:55 编辑:袖梨 来源:一聚教程网
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。
相关文章
- AI也唤不醒“乏力”的618 08-16
- Kimi Work 迎重大升级:推出“目标模式”并打通外部应用插件 08-16
- 起跑线还没过呢,香槟就开了 08-16
- 出海短剧大洗牌:8成消耗流向AI短剧,实拍项目锐减50% 08-16
- 基于多Agent系统自动发现科学假设 08-16
- 一个合格的AI面试官,需要解决企业招聘哪些问题? 08-16