Python 我应该什么时候使用熊猫';分类数据类型?

Python 我应该什么时候使用熊猫';分类数据类型?,python,pandas,memory,categorical-data,Python,Pandas,Memory,Categorical Data,我的问题是优化熊猫系列的内存使用。文件 分类的的内存使用量与分类的数量加上数据的长度成正比。相反,对象dtype是数据长度的常数倍 我的理解是,pandascategory数据实际上是到表示类别的唯一(向下转换)整数的映射,其中整数本身占用的字节(大概)少于构成对象的字符串 我的问题:在使用pd时是否有任何经验法则。Category不会在对象上节省内存?前面提到的比例有多直接,它不也取决于序列中每个元素(字符串)的长度吗 在下面的测试中,pd.category似乎很有希望获胜 import st

我的问题是优化熊猫系列的内存使用。文件

分类的的内存使用量与分类的数量加上数据的长度成正比。相反,
对象
dtype是数据长度的常数倍

我的理解是,pandas
category
数据实际上是到表示类别的唯一(向下转换)整数的映射,其中整数本身占用的字节(大概)少于构成
对象的字符串

我的问题:在使用
pd时是否有任何经验法则。Category
不会在
对象
上节省内存?前面提到的比例有多直接,它不也取决于序列中每个元素(字符串)的长度吗

在下面的测试中,
pd.category
似乎很有希望获胜

import string

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

np.random.seed(444)
%matplotlib inline

def mem_usage(obj, index=False, total=True, deep=True):
    """Memory usage of pandas Series or DataFrame."""
    # Ported from https://www.dataquest.io/blog/pandas-big-data/
    usg = obj.memory_usage(index=index, deep=deep)
    if isinstance(obj, pd.DataFrame) and total:
        usg = usg.sum()
    # Bytes to megabytes
    return usg / 1024 ** 2

catgrs = tuple(string.printable)

lengths = np.arange(1, 10001, dtype=np.uint16)
sizes = []
for length in lengths:
    obj = pd.Series(np.random.choice(catgrs, size=length))
    cat = obj.astype('category')
    sizes.append((mem_usage(obj), mem_usage(cat)))
sizes = np.array(sizes)

fig, ax = plt.subplots()
ax.plot(sizes)
ax.set_ylabel('Size (MB)')
ax.set_xlabel('Series length')
ax.legend(['object dtype', 'category dtype'])
ax.set_title('Memory usage of object vs. category dtype')


尽管如此,对于n而言,分类astype使用的内存更少。然而,一个热编码允许您维护级别的分类排名。您可以分析分类器系数以了解分类数据的行为和预测。

Category正在为每个唯一对象的一个副本建立索引。那么你的物体有多大,有多少独特的物体?建议添加一个绘图,使用唯一对象的数量作为序列长度的比率,因为更可能说明这种关系。
fig, ax = plt.subplots()
ax.plot(sizes[:200])
ax.set_ylabel('Size (MB)')
ax.set_xlabel('Series length')
ax.legend(['object dtype', 'category dtype'])
ax.set_title('Memory usage of object vs. category dtype')