如何在Pandas中创建稀疏布尔掩码?

时间:2017-01-11 05:51:30

标签: pandas numpy sparse-matrix

我有以下代码用于掩码过滤df:

for i, y in enumerate(cols) :
    dfm = df[y].str.contains(s)
    mask= dfm if i==0 else np.column_stack((mask, dfm))

df不是稀疏的,但过滤结果掩码是稀疏的。

在拥有大型数据帧(50十亿行* 100列)时,以完整布尔值存储掩码会占用大量内存。

因此,因为掩码结果非常稀疏(0.1%为TRUE),想知道是否有办法使用稀疏布尔掩码而不是数组掩码来减少内存负载......

即使Pandas中已经存在稀疏数组,也无法找到任何解决方案。 由于目前尚不清楚如何将其用于掩模存储和使用。 即

mask_sparse = pd.SparseArray(mask)

编辑2:澄清问题:   我们可以直接将过滤结果掩码转换为稀疏数组   没有操纵完整的数组?

1 个答案:

答案 0 :(得分:1)

您可以轻松创建稀疏数据帧。但是有一个主要问题!

考虑以下数据帧Width = Truncate( {DesiredWidth} + 9 / {MaxDigitWidth} ) / 256及其内存占用

df

让我们尝试稀疏化

# 10,000 cells with 1% ones and 99% zeros
df = pd.DataFrame(np.random.choice((0, 1), size=(10000, 1000), p=(.99, .01)))
df.memory_usage().sum()

80000080
嗯,那没有做任何事情。那是因为,我们需要指定占多数占位符的对象。我们来看看

df_sparse = df.to_sparse()
df_sparse.memory_usage().sum()

80000080

df_sparse_2 = df.to_sparse(1)
df_sparse_2.memory_usage().sum()

79196744

那更好。确保指定占位符值。