【问题标题】:How to create sparse boolean mask in Pandas?如何在 Pandas 中创建稀疏布尔掩码?
【发布时间】:2017-01-11 05:51:29
【问题描述】:

我有以下代码用于 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不是稀疏的,但是过滤结果掩码是稀疏的。

当有一个大数据帧(50mio 行 * 100 列)时,以完整的布尔值存储掩码会消耗大量内存。

所以,由于掩码结果非常稀疏(0.1% 为 TRUE),想知道是否有办法使用稀疏布尔掩码代替数组掩码以减少内存负载...

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

mask_sparse = pd.SparseArray(mask)

编辑 2:澄清问题: 我们可以直接将过滤结果掩码获取到稀疏数组中吗 无需操作整个数组?

【问题讨论】:

  • 我很困惑。你需要付出更多的努力来解释你拥有、想要和尝试过的东西。阅读本文以更好地了解如何最大限度地提高您的问题得到回答的机会...mcve
  • 谢谢,我已经编辑了我的问题以使其更清晰。
  • stackoverflow.com/questions/36523861/… 是我发现的唯一一个讨论 pd.SparseArray 的 SO 问题。还有一些处理稀疏数据帧或序列的其他方法。
  • stackoverflow.com/questions/41505416/… 是关于使用scipy 稀疏矩阵进行屏蔽。即使有了那些更简单的对象,它也不是微不足道的。

标签: pandas numpy sparse-matrix


【解决方案1】:

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

考虑以下数据框 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

df_sparse_3 = df.to_sparse(0)
df_sparse_3.memory_usage().sum()

803416

这样更好。确保指定占位符值。

【讨论】:

  • Thx,这不是稀疏的数据帧 df 本身,而是稀疏的过滤产生的布尔掩码。
  • @deepmind27 只需将这个想法应用于maskmask = mask.to_sparse(False)
  • 这个面具怎么用?
猜你喜欢
  • 2018-10-27
  • 2013-12-03
  • 2013-05-17
  • 1970-01-01
  • 2017-05-18
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多