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),categoryobject 列批量转 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'}
chunksize 分块处理,每块压缩后再拼接,防止单次加载爆内存类型选错比不压缩更糟——比如把可能超范围的 ID 强制设成 uint16,后续计算会静默溢出。务必核对原始数据分布再 downcast。