Category节省内存靠去重+整数编码,非压缩;唯一率超5%时反而更占内存;astype('category')易致NaN误编码、categories不一致、CPU浪费;.str方法会触发拷贝,sort_values()按categories顺序而非字典序。

Category 类型节省内存,不是靠“压缩”,而是靠**避免重复存储字符串对象**——它把 100 万次 "北京" 换成一个长度为 100 万的 int8 数组 + 一份只含 ["北京", "上海", "广州"] 的短列表。
这背后没有魔法,只有两件事:去重 + 整数编码。但很多人误以为“只要列是字符串就该转 category”,结果内存反而涨了。
什么时候转 category 反而更占内存?
当唯一值太多时,category 就失效了:
-
df["col"].nunique() / len(df) > 0.05(即唯一率超 5%)——比如用户 ID、订单号、长 URL、随机哈希值 - 词典本身存了几乎全部原始字符串,再加一层整数索引,总内存比原
object还高 - 常见误判:看到“字符串列”就
astype('category'),没先算唯一率
astype('category') 默认行为埋了哪些坑?
它看似一行解决,实则静默引入三类问题:
- 含
NaN时,NaN被当作合法 category,导致value_counts(dropna=False)多出一行,groupby结果偏移 - 多个 DataFrame 分别调用
astype('category'),categories顺序/内容不一致,merge或concat会静默失败(值相同但编码不同,匹配不上) - 反复调用会重建
categories,白耗 CPU;推荐显式构造:pd.Categorical(df["col"], categories=df["col"].dropna().unique(), ordered=False)
转完 category,哪些操作会悄悄变慢甚至崩溃?
省内存 ≠ 全面提速,有些操作会隐式退回到 object:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
-
.str.contains()、.str.replace()等方法不支持category,触发完整拷贝,内存瞬间暴涨 -
sort_values()默认按categories定义顺序排,不是字典序;若列是时间字符串如"2023-01"/"2023-10",得显式设ordered=True或改用pd.Categorical(..., ordered=True) -
query("col in ['A','B']")会隐式转换,应改用df["col"].isin(["A","B"])
别只盯列,index 也是内存黑洞
df.index.dtype == 'object' 同样吃内存——尤其当 index 是字符串(如 UUID、业务 ID)时。检查方式:df.index.memory_usage(deep=True)。必要时重置索引或转为 category(需先转为列)。
立即学习“Python免费学习笔记(深入)”;

















