406

現在CSV、スクリプトを実行するたびに、かなり大きなデータフレームをインポートしています。そのデータフレームを実行間で常に利用できるようにするための良い解決策はありますか?

4

13 に答える 13

122

すでにいくつかの回答がありますが、Pandas DataFrames をシリアル化するいくつかの方法を試した素晴らしい比較を見つけました: Efficiently Store Pandas DataFrames

彼らは比較します:

  • pickle: オリジナルの ASCII データ形式
  • cPickle、C ライブラリ
  • pickle-p2: 新しいバイナリ形式を使用
  • json: standardlib json ライブラリ
  • json-no-index: json に似ていますが、インデックスはありません
  • msgpack: バイナリ JSON 代替
  • CSV
  • hdfstore: HDF5 ストレージ形式

彼らの実験では、1,000,000 行の DataFrame をシリアル化し、2 つの列 (1 つはテキスト データ、もう 1 つは数字) を別々にテストしました。彼らの免責事項は次のように述べています。

以下がデータに一般化されるとは信じないでください。自分のデータを見て、自分でベンチマークを実行する必要があります

彼らが参照しているテストのソースコードは、オンラインで入手できます。このコードは直接動作しなかったため、いくつかの小さな変更を加えました。こちらから取得できます: serialize.py 次の結果が得られました。

時間比較結果

彼らはまた、テキスト データをカテゴリデータに変換すると、シリアル化がはるかに高速になると述べています。彼らのテストでは、約 10 倍高速です (テスト コードも参照してください)。

編集:CSVよりもピクルの時間が長いのは、使用されているデータ形式によって説明できます。デフォルトでpickleは、より大きなデータセットを生成する印刷可能な ASCII 表現を使用します。ただし、グラフからわかるように、新しいバイナリ データ形式 (バージョン 2 pickle-p2) を使用する pickle は、読み込み時間が大幅に短縮されています。

その他の参照:

于 2015-11-06T15:24:10.203 に答える
39

私の理解が正しければ、あなたはすでに を使用してpandas.read_csv()いますが、スクリプトを編集するたびにファイルをロードする必要がないように、開発プロセスをスピードアップしたいと考えていますか? いくつかの推奨事項があります。

  1. pandas.read_csv(..., nrows=1000)開発中に、テーブルの最上位ビットのみをロードすることを使用して、CSV ファイルの一部のみをロードできます。

  2. スクリプトを編集してリロードするときに pandas テーブルをメモリに保持するように、インタラクティブなセッションにipythonを使用します。

  3. csv をHDF5 テーブルに変換します

  4. 更新された使用DataFrame.to_feather()と、超高速なpd.read_feather()R 互換のフェザーpandas.to_pickle()バイナリ形式でデータを格納する (私の手では、数値データよりもわずかに高速で、文字列データよりもはるかに高速です)。

また、stackoverflowのこの回答にも興味があるかもしれません。

于 2013-06-13T23:28:07.657 に答える
29

ピクルスが効く!

import pandas as pd
df.to_pickle('123.pkl')    #to save the dataframe, df to 123.pkl
df1 = pd.read_pickle('123.pkl') #to load 123.pkl back to the dataframe df
于 2015-10-10T04:52:42.097 に答える
6

既に述べたように、データ フレームを格納するためのさまざまなオプションとファイル形式 ( HDF5JSONCSVparquetSQL ) があります。ただし、pickle次の理由により、(セットアップによっては)一流の市民ではありません。

  1. pickle潜在的なセキュリティ リスクです。pickleのPython ドキュメントを作成します

警告モジュールは、pickle誤ったデータや悪意を持って作成されたデータに対して安全ではありません。信頼できない、または認証されていないソースから受け取ったデータを unpickle しないでください。

  1. pickle遅い。ここここのベンチマークを見つけてください。

セットアップ/使用状況によっては、両方の制限が適用されませんが、picklepandas データ フレームのデフォルトの永続化としてはお勧めしません。

于 2019-04-11T06:31:32.317 に答える
2

Numpy ファイル形式は、数値データに対して非常に高速です

numpy ファイルは高速で使いやすいため、私は numpy ファイルを使用することを好みます。これは、100 万ポイントの 1 列のデータフレームを保存およびロードするための簡単なベンチマークです。

import numpy as np
import pandas as pd

num_dict = {'voltage': np.random.rand(1000000)}
num_df = pd.DataFrame(num_dict)

ipythonの%%timeit魔法の関数を使って

%%timeit
with open('num.npy', 'wb') as np_file:
    np.save(np_file, num_df)

出力は

100 loops, best of 3: 5.97 ms per loop

データをデータフレームにロードする

%%timeit
with open('num.npy', 'rb') as np_file:
    data = np.load(np_file)

data_df = pd.DataFrame(data)

出力は

100 loops, best of 3: 5.12 ms per loop

悪くない!

短所

Python 2 を使用して numpy ファイルを保存してから、Python 3 を使用して開こうとすると (またはその逆)、問題が発生します。

于 2017-10-13T18:25:24.230 に答える