29

pandasread_csv関数には sparse オプションがないようです。大量のゼロを含む csv データがあります (非常によく圧縮され、0値を取り除くと元のサイズのほぼ半分に縮小されます)。

最初に密行列にロードしてからread_csvを呼び出してみましto_sparseたが、ほとんどのデータは浮動小数点ですが、長い時間がかかり、テキスト フィールドでチョークします。pandas.get_dummies(df)カテゴリ列を 1 と 0 に変換するために最初に呼び出すto_sparse(fill_value=0)と、1,200 万のエントリがあり、ほとんどが 0 のほとんどが数値のテーブルで予想されるよりもはるかに長い時間がかかります。これは、元のファイルからゼロを取り除いて呼び出しto_sparse()ても (フィル値が NaN になるように) 発生します。kind='block'これは、合格かかに関係なく発生しkind='integer'ます。

スパース データフレームを手動で構築する以外に、不要なメモリを消費せずにスパース csv を直接ロードする適切でスムーズな方法はありますか?


3 列の浮動小数点データと 1 列のテキスト データを持つサンプル データセットを作成するコードを次に示します。float 値の約 85% はゼロであり、CSV の合計サイズは約 300 MB ですが、メモリの制約を実際にテストするには、これをさらに大きくすることをお勧めします。

np.random.seed(123)
df=pd.DataFrame( np.random.randn(10000000,3) , columns=list('xyz') )
df[ df < 1.0 ] = 0.0
df['txt'] = np.random.choice( list('abcdefghij'), size=len(df) )
df.to_csv('test.csv',index=False)

そして、これはそれを読むための簡単な方法ですが、より良い、より効率的な方法があることを願っています:

sdf = pd.read_csv( 'test.csv', dtype={'txt':'category'} ).to_sparse(fill_value=0.0)

編集して追加 (JohnE から): 可能であれば、回答に大きな CSV を読み取る際の相対的なパフォーマンス統計をいくつか提供してください。これには、メモリ効率を測定した方法に関する情報も含まれます (特に、メモリ効率はクロック時間よりも測定が難しいため)。特に、メモリ効率が高い場合は、より遅い (クロック タイム) 回答がここでの最良の回答になる可能性があることに注意してください。

4

2 に答える 2