電話するとき
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
警告が表示されるのは、各列のdtypeを推測するのにメモリが非常に必要になるためです。Pandasは、各列のデータを分析して、設定するdtypeを決定しようとします。
パンダは、ファイル全体が読み取られた後に列が持つべきdtypeを決定することしかできません。つまり、最後の値を読み取るときにその列のdtypeを変更しなければならないリスクがない限り、ファイル全体を読み取る前に実際に解析できるものはありません。
user_idという列がある1つのファイルの例を考えてみます。これには、user_idが常に数値である1000万行が含まれています。パンダはそれが数字だけであることを認識できないため、ファイル全体を読み取るまで、それを元の文字列として保持する可能性があります。
追加
dtype={'user_id': int}
これをpd.read_csv()
呼び出すと、パンダはファイルの読み取りを開始したときに、これが整数にすぎないことを認識できます。
また、ファイルの最後の行が列に"foobar"
書き込まれたuser_id
場合、上記の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を参照してください。
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'に似ていますが、欠落データもサポートしています。
ここで完全なリファレンスを読んでください:
設定dtype=object
すると、上記の警告が表示されなくなりますが、メモリ効率は向上せず、処理効率が向上するだけです。
dtype=unicode
numpyではa unicode
はとして表されるため、設定は何もしませんobject
。
@sparrow 'foobar'
は、として指定された列で遭遇したときにパンダが爆発するのを避けるために、コンバーターの使用法を正しく指摘していますint
。コンバーターはパンダで使用するには非常に重く非効率的であり、最後の手段として使用する必要があることを付け加えておきます。これは、read_csvプロセスが単一のプロセスであるためです。
CSVファイルは行ごとに処理できるため、ファイルをセグメントに分割して複数のプロセスを実行するだけで、複数のコンバーターによって並列でより効率的に処理できます。これは、pandasがサポートしていないものです。しかし、これは別の話です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加