[解決済み] Pandas read_csv low_memory と dtype オプション。
質問
電話するとき
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' に似ていますが、欠損データもサポートします。
完全なリファレンスはこちらをご覧ください。
注意事項
設定
dtype=object
は上記の警告を消しますが、メモリ効率が上がるわけではなく、どちらかというと処理効率が上がるだけです。
設定方法
dtype=unicode
は何の役にも立ちません。
unicode
は次のように表されます。
object
.
コンバーターの使用方法
に遭遇したときにパンダが爆発するのを防ぐために、@sparrow がコンバータを使用することを正しく指摘しています。
'foobar'
と指定された列で
int
. コンバータはpandasで使うには本当に重くて非効率的なので、最後の手段として使うべきであることを付け加えておきます。なぜなら、read_csvの処理は1つのプロセスだからです。
CSVファイルは行単位で処理できるため、ファイルを分割して複数の処理を実行するだけで、より効率的に複数のコンバータで並列処理できますが、これはpandasがサポートしていないことです。しかし、これは別の話です。
関連
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] Pandasのカラム名のリネーム
-
[解決済み] Pandas DataFrameからカラムを削除する
-
[解決済み] Pandasのデータフレームで複数の列を選択する
-
[解決済み] Pandas DataFrameの行数を取得する方法は?
-
[解決済み] 一行ずつ追加してPandas Dataframeを作成する
-
[解決済み】Pandas DataFrameのカラムヘッダからリストを取得する。
-
[解決済み】pandasでカラムの種類を変更する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
Pythonコンテナのための組み込み汎用関数操作
-
Python関数の高度な応用を解説
-
Python Decorator 練習問題
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] pandasでcsvファイルを読み込む際のエラー[CParserError.Reading a csv file in pandas]。データのトークン化に失敗しました。Cエラーです。バッファオーバーフローが検出されました - 不正な入力ファイルの可能性があります] 。