0

ブロックがまばらな 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)
4

1 に答える 1

1

HDFStoreこのように使用できます

  • 共通のインデックス (つまりそれ自体) を持つ異なるテーブルを列に格納する

  • all-nan 以外の行のみが格納されます。そのため、列をインテリジェントにグループ化する場合 (たとえば、同じ場所に多くのまばらな傾向がある列をまとめます)。「スパース」のようなレイアウトを実現できると思います。

  • 必要に応じてテーブルを圧縮できます。

  • 次に、個々のテーブルにクエリを実行し、座標を取得して他のテーブルからプルできます (これが select_as_multiple の機能です)。

小さな例と、データ セットのおおよそのサイズ (行数、列数、ばらばらなグループなど) を教えてください。

クエリはどのように見えますか? これは、一般的に私が問題に取り組む方法です。クエリを実行する方法を考えてみましょう。これにより、データ レイアウトの保存方法が定義されます。

于 2013-09-23T01:05:37.317 に答える