因为Pandas默认用int64/float64/object等宽类型存储数据,而实际取值范围小或语义明确时,改用最小够用类型(如uint8、category、float32)可减少7/8甚至更多内存占用。

为什么 dtype 参数能大幅降低内存占用?
Pandas 默认对数值列用 float64、int64,对字符串列用 object(实际是 Python str 指针数组),这在读取大文件时极易爆内存。比如一个只含 0–255 整数的列,用 int64 存储会浪费 7/8 的空间;而 object 类型每单元额外携带引用开销,比 string[pyarrow] 或 category 高出数倍。
关键不是“加 dtype”,而是**按数据实际取值范围和语义选最小够用类型**——这是压缩内存最直接有效的手段。
哪些列该优先改类型?怎么改?
优先处理三类高消耗列:整数 ID、分类字段(如省份、状态)、低精度浮点指标(如评分、比例)。实操建议如下:
-
整数列:先用
df[col].nunique()看去重数,再用df[col].min()/df[col].max()确定范围 → 选uint8/int16/uint32等。例如用户等级 1–5,用uint8即可 - 分类列:若唯一值 category → 内存常降 5–10 倍
-
浮点列:确认业务允许精度损失后,用
float32替代float64(省一半内存);若为百分比且只保留 2 位小数,可转uint16存「放大 100 倍的整数」 -
字符串列:避免
object,优先试string[pyarrow](Pandas 1.3+),或用category(仅当重复率高)
读取时指定 dtype 比读完再 astype() 更省内存
调用 pd.read_csv() 时传入 dtype 字典,Pandas 会在解析阶段直接分配紧凑内存;而先读成默认类型再 astype(),中间会存在两份数据副本,可能触发 OOM。
立即学习“Python免费学习笔记(深入)”;
示例:
dtypes = {
'user_id': 'uint32',
'status': 'category',
'score': 'float32',
'region': 'category'
}
df = pd.read_csv('data.csv', dtype=dtypes)
注意:category 列不能用于数值计算,需先 df['col'].cat.codes 转编码;string[pyarrow] 需提前 pip install pyarrow,且部分旧 Pandas 版本不支持。
容易被忽略的陷阱:空值与混合类型
int8/uint8 等整数类型**不支持 NaN**,遇到空值会静默转成 float64 —— 这会让前面所有优化失效。解决方法:
- 用可空整型:如
Int8(首字母大写,Pandas nullable 类型),它底层用object或int32+ mask 实现,虽比纯uint8稍大,但仍远小于默认float64 - 读取前用
na_values和keep_default_na=False显式控制空值识别 - 混合类型列(如数字+字符串)无法安全设
dtype,必须先清洗或保留object,再拆解
真正省内存的关键,往往卡在「以为设了 dtype 就万事大吉」,却没检查空值如何破坏类型契约。


















