2016-02-03 8 views
5

異なる列のdataFrameをhdf5ファイルに保存したい(以下のデータタイプの抜粋を見つける)。混合データとカテゴリを含むデータフレームをhdf5に格納

In [1]: mydf 
Out [1]: 
endTime    uint32 
distance   float16 
signature   category 
anchorName  category 
stationList   object 

いくつかの列(上記の私の抜粋で署名とanchorName)を変換する前に、私は(かなり正常に動作している)、それを保存するために、次のようなコードを使用:

path = 'tmp4.hdf5' 
key = 'journeys' 
mydf.to_hdf(path, key, mode='w', complevel=9, complib='bzip2') 

しかし、それは、カテゴリでは動作しません。

path = 'tmp4.hdf5' 
key = 'journeys' 
mydf.to_hdf(path, key, mode='w', format='t', complevel=9, complib='bzip2') 

各項目が文字列のリストであるstationListという列を削除すると、問題なく動作します。しかし、このコラムでは、次の例外があります。

Cannot serialize the column [stationList] because 
its data contents are [mixed] object dtype 

データフレームを保存するにはどうすればコードを改善する必要がありますか?

パンダのバージョン:0.17.1
Pythonバージョン:2.7.6(これはcompabilityの理由にそれを変更することはできません)


EDIT1(いくつかのサンプルコード):

import pandas as pd 

mydf = pd.DataFrame({'endTime' : pd.Series([1443525810,1443540836,1443609470]), 
        'distance' : pd.Series([454.75,477.25,242.12]), 
        'signature' : pd.Series(['ab','cd','ab']), 
        'anchorName' : pd.Series(['tec','ing','pol']), 
        'stationList' : pd.Series([['t1','t2','t3'],['4','t2','t3'],['t3','t2','t4']]) 
        }) 

# this works fine (no category) 
mydf.to_hdf('tmp_without_cat.hdf5', 'journeys', mode='w', complevel=9, complib='bzip2') 

for col in ['anchorName', 'signature']: 
    mydf[col] = mydf[col].astype('category') 

# this crashes now because of category data 
# mydf.to_hdf('tmp_with_cat.hdf5', 'journeys', mode='w', complevel=9, complib='bzip2') 

# switching to format='t' 
# this caused problems because of "mixed data" in column stationList 
mydf.to_hdf('tmp_with_cat.hdf5', 'journeys', mode='w', format='t', complevel=9, complib='bzip2') 

mydf.pop('stationList') 

# this again works fine 
mydf.to_hdf('tmp_with_cat_without_stationList.hdf5', 'journeys', mode='w', format='t', complevel=9, complib='bzip2') 

edit2: 一方、私はこの問題を取り除くためにさまざまなことを試みました。これらのうちの1つは、stationListの列をtupelsに変換し(変更することはできないため可能)、カテゴリにも変換することでした。しかしそれは何も変わらなかった。ここ は(単に完全性のために)私は、変換ループの後に追加された行は、次のとおりです。

mydf.stationList = [tuple(x) for x in mydf.stationList.values] 
mydf.stationList.astype('category') 
+0

これは質問ですか?また、テストデータフレームを作成するための実際のコードを投稿した場合にも役立ちます。 – Goyo

+0

それは問題です。私は他のいくつかのスクリプトによって保存された他のファイルからデータを取得します。私は私の問題を示すことができる基本的なデータ生成を作成しようとします。 – AnnetteC

+0

これまでカテゴリとリスト/タプルの両方を同じhdf5形式で保存することはできないようです(これは将来修正される可能性があります)。私はあなたの要求についてもっと知らなくても何を変えるべきか教えてくれません。おそらく文字列として文字列を残して、多分stationList項目の別の表現を選択する...あまりにも多くのオプションがあります。 – Goyo

答えて

5

次の2つの問題を抱えて:あなたはHDF5ファイル内のカテゴリのデータを格納したい

  1. を。
  2. HDF5ファイルに任意のオブジェクト(例:stationList)を保存しようとしています。

あなたが発見したように、カテゴリデータはHDF5の「テーブル」形式でのみサポートされています(現在は?)。

しかし、任意のオブジェクト(文字列のリストなど)を格納することは、実際にはHDF5フォーマット自体でサポートされているものではありません。 Pandasはpickleを使ってこれらのオブジェクトをシリアライズし、次にpickleを任意の長さの文字列として格納することでこれを回避しています(これはすべてのHDF5フォーマットでサポートされていません)。しかし、それは遅くて非効率的で、HDF5ではうまくサポートされません。あなたは駅の名前によるデータの1行を持っているので、

  1. ピボットデータ:私の心の中で

    は、次の2つのオプションがあります。その後、すべてをテーブル形式のHDF5ファイルに保存できます。 Hadley Wickham on Tidy Dataを参照してください。

  2. この形式を本当に保持したい場合は、to_pickle()を使用してデータフレーム全体を保存することもできます。これは、どのような種類のオブジェクト(例えば、文字列のリストなど)を指定することができます。

個人的には、私はオプション1をお勧めします。高速なバイナリファイル形式を使用することになります。ピボットは、データを使った他の操作も容易にします。

+1

この問題は非常に標準的ですが、解決策はほとんどありません – Tensor

関連する問題