ブロックがまばらな DataFrame があるとします。これは、null 以外の列のセットが互いに素な行のグループがあることを意味します。これを巨大なテーブルに格納すると、値に多くのメモリが使用され (nan の充填)、テーブルを行にスタック解除すると、大きなインデックスが作成されます (少なくとも、ディスクに保存するとそのように見えます...進行中と思われる効率的な MultiIndexing です)。
通常、ブロックを個別の DataFrame として dict または list (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)