ファイルから情報を抽出して、対象のレコードのみをフィルタリングし、ジェネレーターが返すタプルに変換するタプル ジェネレーターを作成しました。
以下から DataFrame を作成しようとしました。
import pandas as pd
df = pd.DataFrame.from_records(tuple_generator, columns = tuple_fields_name_list)
しかし、エラーがスローされます:
...
C:\Anaconda\envs\py33\lib\site-packages\pandas\core\frame.py in from_records(cls, data, index, exclude, columns, coerce_float, nrows)
1046 values.append(row)
1047 i += 1
-> 1048 if i >= nrows:
1049 break
1050
TypeError: unorderable types: int() >= NoneType()
リスト内のジェネレーターを消費して動作するように管理しましたが、2 倍のメモリを使用します。
df = pd.DataFrame.from_records(list(tuple_generator), columns = tuple_fields_name_list)
読み込みたいファイルが大きく、メモリ消費が問題になります。最後の試行では、私のコンピューターは仮想メモリをインクリメントするのに 2 時間を費やしました :(
質問:事前にリストに変換せずに、レコード ジェネレーターから直接 DataFrame を作成する方法を知っている人はいますか?
注: 私は Windows 上の Anaconda で python 3.3 と pandas 0.12 を使用しています。
アップデート:
ファイルの読み取りの問題ではありません。私のタプルジェネレーターはうまく機能します。混合レコードのテキスト圧縮ファイルを1行ずつスキャンし、必要なデータのみを正しいタイプに変換してから、タプルフォームのジェネレーターでフィールドを生成します。数によっては、圧縮されていない約 6.5GB の 130MB の gzip ファイルで 2111412 レコードを、約 1 分でほとんどメモリを使用せずにスキャンします。
Pandas 0.12 ではジェネレーターを使用できません。dev バージョンでは使用できますが、すべてのジェネレーターをリストに入れてからフレームに変換します。効率的ではありませんが、内部でパンダを処理する必要があります。それまでの間、メモリを追加購入することを検討する必要があります。