0

假设我有一个块稀疏的 DataFrame。我的意思是,有些行组具有不相交的非空列集。存储这个巨大的表将在值中使用更多内存(nan 填充)并将表拆分为行将创建一个大索引(至少在保存到磁盘时看起来是这样......我不是 100% 清楚是否有是一些应该进行的高效 MultiIndexing)。

通常,我将块作为单独的 DataFrame 存储在 dict 或列表中(删除 nan 列),并创建一个与 DataFrame 具有几乎相同 api 的类,“手​​动”将查询传递给块并连接结果。这很好用,但需要一些特殊的代码来存储和处理这些对象。

最近,我注意到 pytables 提供了与此类似的功能,但仅适用于 pytables 查询 api。

有没有办法在熊猫中本地处理这个问题?还是我错过了一些更简单的方法来获得性能相似的解决方案?

编辑:这是一个小示例数据集

import pandas, string, itertools
from pylab import *

# create some data and put it in a list of blocks (d)
m = 10; n = 6;
s = list(string.ascii_uppercase)
A = array([s[x] * (1 + mod(x, 3)) for x in randint(0, 26, m*n)]).reshape(m, n)
df = pandas.DataFrame(A)
d = list()
d += [df.ix[0:(m/2)].T.ix[0:(n/2)].T]
d += [df.ix[(m/2):].T.ix[(n/2):].T]

# 1. use lots of memory, fill with na
d0 = pandas.concat(d) # this is just the original df

# 2. maybe ok, not sure how this is handled across different pandas versions
d1 = pandas.concat([x.unstack() for x in d])

# want this to work however the blocks are stored
print(d0.ix[[0, 8]][[2,5]])

# this raises exception
sdf = pandas.SparseDataFrame(df)
4

1 回答 1

1

你可以用HDFStore这种方式

  • 用一个共同的索引(即它本身)存储不同的表一列

  • 只有非全南行将被存储。因此,如果您智能地对列进行分组(例如,将那些往往会在同一个地方有很多稀疏性的列放在一起)。我认为您可以实现类似“稀疏”的布局。

  • 如有必要,您可以压缩表格。

  • 然后,您可以查询单个表,并获取坐标然后从其他表中提取(这就是 select_as_multiple 所做的)。

你能提供一个小例子,以及数据集的粗略大小,例如行数、列数、不相交的组等。

您的查询是什么样的?这通常是我处理问题的方式。弄清楚我们将如何查询;这将定义如何存储数据布局。

于 2013-09-23T01:05:37.317 回答