2013-05-19 13 views
5

私はパンダでのデータフレームがあります。私は、ディスクにこれを保存しようとすると(「オブジェクトヘッダメッセージが大きすぎる」)

In [7]: my_df 
Out[7]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 34 entries, 0 to 0 
Columns: 2661 entries, airplane to zoo 
dtypes: float64(2659), object(2) 

を:

store = pd.HDFStore(p_full_h5) 
store.append('my_df', my_df) 

私は取得:

File "H5A.c", line 254, in H5Acreate2 
    unable to create attribute 
    File "H5A.c", line 503, in H5A_create 
    unable to create attribute in object header 
    File "H5Oattribute.c", line 347, in H5O_attr_create 
    unable to create new attribute in header 
    File "H5Omessage.c", line 224, in H5O_msg_append_real 
    unable to create new message 
    File "H5Omessage.c", line 1945, in H5O_msg_alloc 
    unable to allocate space for message 
    File "H5Oalloc.c", line 1142, in H5O_alloc 
    object header message is too large 

End of HDF5 error back trace 

Can't set attribute 'non_index_axes' in node: 
/my_df(Group) u''. 

なぜですか?

注:

In[12]: max([len(x) for x in list(my_df.columns)]) 
Out{12]: 47 

これは、すべてのパンダ0.11とIPython、PythonとHDF5の最新の安定版である:それは重要場合は、データフレームの列名は、単純な小さな文字列です。

+0

問題はあなたのインデックスです。彼らはすべて0ですか?それは本当に奇妙です。あなたのフレームのサンプルを表示できますか? – Jeff

+0

一般に、列よりも多くの行が必要です。 hdf5は行ベースです。あなたのフレームの転置を保存してみてください – Jeff

答えて

7

HDF5の列のすべてのメタデータのヘッダーの制限は64kbです。これには名前、型などが含まれます。約2000の列を移動すると、すべてのメタデータを格納する領域が不足します。これはpytablesの基本的な制限です。私は彼らがすぐに彼らの側で回避策を作るとは思わない。テーブルを分割するか、別のストレージ形式を選択する必要があります。 2014年のよう

+0

ありがとう@ BrianWang0。私の問題を考えると、HDF5の代替案はありますか? –

+0

クエリやアペンダビリティ、圧縮率は気になりますか?試して、 'my_df.to_hdf(output_name、 'my_df'、format = 'f')'を呼んでください。私はPyTablesの専門家ではありませんが、私は膨大な量のカラムを持っていました。何らかの形で_fixed_形式に_table_形式としてこの制限がありません。これは私にとって最も簡単な解決策でした。 – BrianWang0

+1

または、1つのデータフレームから複数のデータフレームを作成する場合と同様に、テーブルを分割することができます。各データフレームにはすべての列のサブセットがあります。各データフレームをHDF5storeに保存します。単純な解決策が必要な場合は、単純なテキストCSVに書き込んでください。繰り返しますが、私は専門家ではありません。誰かがおそらく私よりもはるかに良い提案をすることができます。 – BrianWang0

4

、HDFはpandasについてはupdated

 
If you are using HDF5 1.8.0 or previous releases, there is a limit on the number 
of fields you can have in a compound datatype. 
This is due to the 64K limit on object header messages, into which datatypes are encoded. (However, you can create a lot of fields before it will fail. 
One user was able to create up to 1260 fields in a compound datatype before it failed.) 

あり、それはformat='fixed'オプション、フォーマット「テーブル」で列のarbirtary数のデータフレームを保存することができ、まだトピックと同じエラーが発生します。 私もh5pyを試してみましたが、「大きすぎるヘッダー」のエラーもありました(バージョンは1.8.0以上でしたが)。

関連する問題