当前位置:首页>python>Python(Pandas分类变量内存优化):海量数据表category类型降内存实战

Python(Pandas分类变量内存优化):海量数据表category类型降内存实战

  • 2026-09-03 21:27:41
Python(Pandas分类变量内存优化):海量数据表category类型降内存实战
业务导出的百万级CSV数据表中,大量字符串维度字段(地区、业务类型、状态)重复值占比极高,直接以object类型存储会占用巨额内存,程序容易OOM崩溃。本文讲解Pandas category分类类型改造方案,在不改动业务逻辑前提下大幅降低内存占用。

场景:日志数据表,包含area地区、biz_type业务类型、status状态等高重复字符串字段,读取后内存占用过高,数据分析脚本频繁被系统杀死。需要在不修改业务逻辑前提下降低内存消耗。测试数据字段说明:

  • log_id:日志编号
  • area:地区(北京、上海、广州、成都循环重复)
  • biz_type:业务类型(支付、登录、查询)
  • status:状态(成功、失败)
  • create_time:生成时间
import pandas as pdimport numpy as np# 构造百万行测试数据n = 1000000data = {    "log_id": np.arange(n),    "area": np.random.choice(["北京","上海","广州","成都"], size=n),    "biz_type": np.random.choice(["支付","登录","查询"], size=n),    "status": np.random.choice(["成功","失败"], size=n),    "create_time": pd.date_range("2026-01-01", periods=n, freq="1s")}df = pd.DataFrame(data)# 查看原始内存print("转换前内存:")print(df[["area","biz_type","status"]].memory_usage(deep=True))# 将高重复字符串转为category类型df["area"] = df["area"].astype("category")df["biz_type"] = df["biz_type"].astype("category")df["status"] = df["status"].astype("category")print("\n转换后内存:")print(df[["area","biz_type","status"]].memory_usage(deep=True))# category正常筛选、分组示例df_success = df[df["status"] == "成功"]group_result = df.groupby(["area","biz_type"]).size()print("\n分组统计结果:")print(group_result.head())
输出数据结果
转换前内存:Index            132area        14000000biz_type    14000000status      14000000dtype: int64转换后内存:Index           132area        1000057biz_type    1000043status      1000029dtype: int64分组统计结果:area  biz_type上海    支付          83537      查询          83348      登录          83626北京    支付          83284      查询          83521dtype: int64

核心总结

  1. category适合字段唯一值远小于总行数的维度列,重复越多内存收益越大;
  2. astype("category")原地转换,过滤、groupby可以直接使用,业务代码几乎不用改动;
  3. 不适合唯一值很多的字段,如用户ID、长文本,反而会增大内存;
  4. 做concat拼接时,分类列会恢复object,需要重新转换category。

最新文章

随机文章