【问题标题】:Memory efficient way to store bool and NaN values in pandas在 pandas 中存储 bool 和 NaN 值的内存有效方法
【发布时间】:2018-11-25 10:08:09
【问题描述】:

我正在处理一个相当大的数据集(超过 4 GB),它是我在pandas 中导入的。该数据集中的相当多的列是简单的真/假指示符,自然地,最节省内存的存储这些列的方法是为此列使用bool dtype。但是,该列还包含一些我想保留的 NaN 值。现在,这导致列具有 dtype 浮点数(值 1.00.0np.nan)或对象,但它们都使用了太多内存。

举个例子:

df = pd.DataFrame([[True,True,True],[False,False,False], 
                   [np.nan,np.nan,np.nan]])
df[1] = df[1].astype(bool)
df[2] = df[2].astype(float)
print(df)
print(df.memory_usage(index=False, deep=True))
print(df.memory_usage(index=False, deep=False))

结果

       0      1    2
0   True   True  1.0
1  False  False  0.0
2    NaN   True  NaN

0       100
1         3
2        24
dtype: int64

0        24
1         3
2        24
dtype: int64

什么是存储这些值的最有效方法,知道它们只能采用 3 种不同的值:TrueFalse<undefined>

【问题讨论】:

    标签: python python-3.x pandas memory nan


    【解决方案1】:

    使用数据类型:int8

    1 = True
    0 = False
    -1 = NaN
    

    这比 float32 好 4 倍,比 float64 好 8 倍

    【讨论】:

      【解决方案2】:

      在上一个答案的基础上,可能值得一提的是Pandas has an "integer NaN" as of v1.0.0 (pd.NA),它的存在允许列的 dtype 保持为整数。从链接的文档页面:

      在处理缺失数据中,我们看到 pandas 主要使用 NaN 来表示缺失数据。因为 NaN 是浮点数,这会强制具有任何缺失值的整数数组变为浮点数。在某些情况下,这可能无关紧要。但是,如果您的整数列是一个标识符,那么转换为浮点数可能会出现问题。有些整数甚至不能表示为浮点数。

      这可能比将 NaN 编码为一些已知无效的整数值更具可读性,当然pd.isna 会为它们返回True

      与简单的整数相比,我不知道这对内存有什么影响。

      【讨论】:

        猜你喜欢
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 2014-01-29
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多