1. ホーム
  2. python

[解決済み] Pandas read_csv low_memory と dtype オプション。

2022-02-02 05:29:42

質問

電話するとき

df = pd.read_csv('somefile.csv')

得ることができる。

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: 列 (4,5,7,16) の型が混在しています。 dtypeを指定してください。 オプションを使用するか、low_memory=False を設定してください。

なぜ dtype オプションに関連する low_memory というのは、なぜ False この問題を解決するために必要なことは何でしょうか?

解決方法は?

非推奨の low_memory オプションについて

low_memory オプションは適切に非推奨とされていませんが、実際には何も変わらないので、非推奨とすべきです[ ]。 ソース ]

このようになるのは low_memory の警告は、各カラムの dtypes を推測することが非常にメモリ負荷が高いからです。Pandasは各カラムのデータを分析することで、どのようなdtypeを設定すべきかを判断しようとします。

D型推測 (非常に悪い)

Pandasは、ファイル全体を読み込んでからでないと、カラムがどのようなdtypeを持つべきかを判断することができません。つまり、ファイル全体が読み込まれる前に、最後の値を読み込むときにそのカラムの dtype を変更しなければならないリスクを冒さない限り、実際には何もパースできないのです。

user_idというカラムを持つあるファイルを例にとって考えてみましょう。 このファイルには、user_id が常に数字である 1,000 万行が含まれています。 pandasはそれが数字だけであることを知ることができないので、おそらくファイル全体を読み込むまで元の文字列のままにしておくでしょう。

dtypesの指定(必ず行うべき)

添加

dtype={'user_id': int}

から pd.read_csv() の呼び出しは、pandasがファイルを読み始めるときに、これが整数だけであることを知るようにします。

また、注目すべきは、もしファイルの最後の行が "foobar" の中に書かれている user_id カラムに上記のdtypeが指定された場合、読み込みがクラッシュします。

dtypesを定義すると壊れるデータの例

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'

dtypesは典型的なnumpyのもので、それについてもっと読むにはここをクリックしてください。 http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

どのようなdtypesがありますか?

私たちは、numpyのdtypesであるfloat, int, bool, timedelta64[ns], datetime64[ns]にアクセスすることができます。numpyの日付/時刻のdtypesは、以下のことに注意してください。 ではない タイムゾーンを認識します。

Pandasはこのdtypesのセットを独自のもので拡張しています。

'datetime64[ns, <tz>]' これはタイムゾーンを意識したタイムスタンプです。

カテゴリー」は、基本的に列挙型(整数のキーで表現された文字列で、保存される

period[]' timedeltaと混同しないように、これらのオブジェクトは、実際には特定の期間に固定されています。

'Sparse', 'Sparse[int]', 'Sparse[float]' は、スパースデータまたは「穴の多いデータ」用です。データフレームにNaNまたはNoneを保存する代わりに、オブジェクトを省略してスペースを節約できます。

インターバル」はそれ自体のトピックだが、主な用途はインデックス作成である。 詳しくはこちら

'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' はすべてpandas特有の整数で、numpyのバリアントとは異なりnullableであること。

string' は、文字列データを扱うための特別な dtype であり、文字列データへのアクセスを提供します。 .str 属性で指定します。

'boolean' は、numpy の 'bool' に似ていますが、欠損データもサポートします。

完全なリファレンスはこちらをご覧ください。

Pandas d型リファレンス

注意事項

設定 dtype=object は上記の警告を消しますが、メモリ効率が上がるわけではなく、どちらかというと処理効率が上がるだけです。

設定方法 dtype=unicode は何の役にも立ちません。 unicode は次のように表されます。 object .

コンバーターの使用方法

に遭遇したときにパンダが爆発するのを防ぐために、@sparrow がコンバータを使用することを正しく指摘しています。 'foobar' と指定された列で int . コンバータはpandasで使うには本当に重くて非効率的なので、最後の手段として使うべきであることを付け加えておきます。なぜなら、read_csvの処理は1つのプロセスだからです。

CSVファイルは行単位で処理できるため、ファイルを分割して複数の処理を実行するだけで、より効率的に複数のコンバータで並列処理できますが、これはpandasがサポートしていないことです。しかし、これは別の話です。