パンダのデータフレームをHDF5ストア(.h5ファイル)に保存したいだけです。以下は私が使用しているコードです。パンダのデータフレームをHDF5ストアとして保存すると、さまざまなエラーが発生する
# Fake data over N runs
Data_N = []
for n in range(5):
Data_N.append(np.random.randn(5000,15,125))
# Create HDFStore object
store = pd.HDFStore('test.h5')
# For each run:
for n in range(len(Data_N)):
Data = Data_N[n]
# Pandas DataFrame for "flattened" fake data
Data_subDFs = []
nanbuff = np.nan*np.zeros((1,len(Data[0,0])))
for i in range(len(Data)):
Data_i = np.vstack((nanbuff,Data[i,:,:]))
Data_subDFs.append(pd.DataFrame(data = Data_i))
Data_DF = pd.concat(Data_subDFs)
# Row and column labels for the DataFrame
Data_rows = []
for i in range(len(Data)):
Data_rows.append(['Layer %d:' % (i+1)] + range(1,len(Data[0])+1))
Data_DF.index = sum(Data_rows,[])
Data_DF.columns = range(1,len(Data[0,0])+1)
# Put Pandas DataFrame into store
store.put('Data_DF_%d' % (n+1), Data_DF)
#store.put('Data_DF_%d' % (n+1), Data_DF, format='table')
#store.put('Data_DF_%d' % (n+1), Data_DF, format='table', data_columns=True)
# Save the HDF5 file
store.close()
これは次のように出力できます:私はプットの3番目のバージョンを使用している場合、それを
TypeError: Passing an incorrect value to a table column. Expected a Col (or subc
lass) instance and got: "ObjectAtom()". Please make use of the Col(), or descend
ant, constructor to properly initialize columns.
そして:
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed-integer,key->axis1] [items->None]
私はプットの第二のバージョンを使用している場合は、それが与えるを与える:
ValueError: cannot have non-object label DataIndexableCol
canon eさまざまなバージョンを説明してください。なぜ、私がHDF5でPandas DataFrameが有効であると思うものを節約することなく保存できないのですか?
私が役に立ったら、DataFrame/storeを追加する必要はないと思います。私は、Pandas HDF5インターフェイスを使ってDFを保存する最高のパフォーマンスを求めています。
ありがとうございます!
EDIT 1:
私は後に、コードを更新し、 "各実行の場合:" この
# For each run:
for run in range(len(Data_N)):
Data = Data_N[run]
l = len(Data)
m = len(Data[0])
n = len(Data[0,0])
# Pandas DataFrame for "flattened" fake data
Data_subDFs = []
for i in range(len(Data)):
Data_i = Data[i,:,:]
Data_subDFs.append(pd.DataFrame(data = Data_i))
Data_DF = pd.concat(Data_subDFs)
# Row and column labels for the DataFrame
L1 = np.zeros((l*m,1), dtype=object) # Layer number
L2 = np.zeros((l*m,1), dtype=object) # Row number
for i in range(l):
for j in range(m):
L1[i*m + j,0] = 'Layer %d' % (i+1)
L2[i*m + j,0] = '%d' % (j+1)
Data_DF.index = np.hstack((L1,L2))
Data_DF.columns = range(1,n+1)
# Put Pandas DataFrame into store
store.put('Data_DF_%d' % (run+1), Data_DF)
#store.put('Data_DF_%d' % (run+1), Data_DF, format='table')
#store.put('Data_DF_%d' % (run+1), Data_DF, format='table', data_columns=True)
にしかし、それは各プット・ラインのために、同じ警告またはエラーが発生します。
EDIT 2(これは働いていた!):
# For each run:
for run in range(len(Data_N)):
Data = Data_N[run]
l = len(Data)
m = len(Data[0])
n = len(Data[0,0])
# Pandas DataFrame for "flattened" fake data
Data_DF = pd.DataFrame(Data.reshape(l*m,n))
# Layer and row labels
layers = np.arange(1,l+1)
rows = np.arange(1,m+1)
# Pandas multi-index
mindex = pd.MultiIndex.from_product([layers,rows], names=['Layer','Row'])
# DataFrame multi-index and column labels
Data_DF.index = mindex
Data_DF.columns = range(1,n+1)
# Put Pandas DataFrame into store
store.put('Data_DF_%d' % (run+1), Data_DF)
#store.put('Data_DF_%d' % (run+1), Data_DF, format='table')
#store.put('Data_DF_%d' % (run+1), Data_DF, format='table', data_columns=True)
第三プット・ラインはまだ同じエラーになりますが、2番目のラインが動作するので、私は3行目はちょうどであると仮定しますこの場合無効なコマンドです。
第2ラインは第1ラインよりかなり高速で、両方とも酸洗いルートよりもかなり速かった。ありがとう!
こんにちは、提案していただきありがとうございます。私は複数のインデックスを使用しようと私の投稿を編集しました。しかし、それは動作しませんでした。それ以上の提案はありますか?間違って実装しましたか?ありがとう – leka0024
ありがとう!!それはうまくいった(元の投稿をもう一度更新した)。私はあなたの答えを正しく投票し、それを投票しようとしましたが、私は十分な信用がありません。再度、感謝します! – leka0024