非推奨のlow_memoryオプション
このlow_memory
オプションは適切に非推奨ではありませんが、実際には何も異なることはないので、非推奨にする必要があります[ ソース ]
このlow_memory
警告が表示されるのは、各列のdtypeを推測するのにメモリが非常に必要になるためです。パンダは、各列のデータを分析して、設定するdtypeを決定しようとします。
Dtype推測(非常に悪い)
パンダは、ファイル全体が読み取られた後でのみ、列に必要なdtypeを決定できます。つまり、最後の値を読み取るときにその列のdtypeを変更しなければならないリスクがない限り、ファイル全体を読み取る前に実際に解析できるものはありません。
user_idという列がある1つのファイルの例を考えてみます。これには、user_idが常に数値である1000万行が含まれます。パンダはそれが数字だけであることを認識できないため、ファイル全体を読み取るまで、それを元の文字列として保持する可能性があります。
dtypesの指定(常に実行する必要があります)
追加
dtype={'user_id': int}
pd.read_csv()
呼び出しに応じて、パンダはファイルの読み取りを開始すると、これは整数のみであることを認識します。
また、ファイルの最後の行が列に"foobar"
書き込まれたuser_id
場合、上記のdtypeが指定されているとロードがクラッシュすることにも注意してください。
dtypeが定義されているときに壊れる壊れたデータの例
import pandas as pd
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})
ValueError: invalid literal for long() with base 10: 'foobar'
通常、dtypeは数の多いものです。詳しくは、http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.htmlをご覧ください。
どんなdtypeが存在しますか?
numpy dtypes:float、int、bool、timedelta64 [ns]、datetime64 [ns]にアクセスできます。numpyの日付/時刻のdtypeはタイムゾーンに対応していないことに注意してください。
パンダはこのdtypeのセットを独自に拡張します。
'datetime64 [ns、]'これはタイムゾーンを認識するタイムスタンプです。
基本的に列挙型(保存する整数キーで表される文字列)である「カテゴリ」
'period []' timedeltaと混同しないでください。これらのオブジェクトは実際には特定の期間に固定されています
'Sparse'、 'Sparse [int]'、 'Sparse [float]'は、スパースデータまたは '多数の穴があるデータ'の場合NaNまたはNoneをデータフレームに保存する代わりに、オブジェクトを省略してスペースを節約します。
「間隔」はそれ自体のトピックですが、その主な用途は索引付けです。詳細はこちら
'Int8'、 'Int16'、 'Int32'、 'Int64'、 'UInt8'、 'UInt16'、 'UInt32'、 'UInt64'は、numpyバリアントとは異なり、すべてnull可能なパンダ固有の整数です。
'string'は、文字列データを操作するための特定のdtype .str
であり、シリーズの属性へのアクセスを提供します。
'boolean'は派手な 'bool'に似ていますが、欠落データもサポートしています。
ここで完全なリファレンスを読んでください:
Pandas dtypeリファレンス
落とし穴、警告、メモ
設定dtype=object
すると、上記の警告が表示されなくなりますが、メモリ効率は向上せず、処理効率が向上するだけです。
dtype=unicode
numpyではa unicode
はとして表されるため、設定は何もしませんobject
。
コンバーターの使用
@sparrow 'foobar'
は、として指定された列で遭遇したときにパンダが爆発するのを避けるために、コンバーターの使用法を正しく指摘していますint
。コンバーターはパンダで使用するには非常に重く非効率的であり、最後の手段として使用する必要があることを付け加えておきます。これは、read_csvプロセスが単一のプロセスであるためです。
CSVファイルは1行ずつ処理できるため、ファイルをセグメントに分割して複数のプロセスを実行するだけで、複数のコンバーターで並行してより効率的に処理できます。これは、pandasがサポートしていないものです。しかし、これは別の話です。