为何将DataFrame列转为category类型未节省内存?
转category后内存反而升高的原因
核心原因是你的ABN_CONTRAT列唯一值占比极高,几乎没有重复内容。
pandas的category类型能节省内存的前提是列中存在大量重复字符串:它会把重复字符串映射成整数存储,只保留一份唯一字符串列表,再用整数数组记录每行对应的索引。但如果列里的字符串几乎都是唯一的(比如每个值都不一样),就会出现反效果:
- 整数数组需要用足够大的整数类型存储所有唯一值的索引(比如唯一值超过2^32时,得用64位整数,和原object类型的指针大小一致)
- 还要额外存储所有唯一字符串的列表,这部分会增加额外内存占用
从你的数据可以计算验证:
- 原
ABN_CONTRAT列内存15218784字节,对应行数为15218784 / 8 = 1902348行(64位系统中object类型每个元素是8字节指针) - 转category后内存28190544字节,显然是整数数组的大小加上唯一字符串的总大小,超过了原指针内存的总和。
你可以用以下代码确认唯一值占比:
# 查看唯一值数量 unique_count = df1['ABN_CONTRAT'].nunique() # 查看总行数 total_rows = len(df1) # 计算占比 ratio = unique_count / total_rows print(f"唯一值占比: {ratio:.2%}")
如果占比接近100%,category完全不适合这个列。只有当唯一值占比很低(比如低于10%)时,使用category才能有效节省内存。
内容的提问来源于stack exchange,提问作者pacdev
相关产品推荐
相关产品推荐

