表形式のデータを分析する際は
- いったん全列読み込む
- 分析に必要な列のみ抽出する
ことが多いと思います。データが大きくなければ問題ないですがデータが大きい場合には時間、メモリを余分に消費してしまいます。
Pandasではread_csv関数やread_table関数で特定列のみ読み込むことができ計算量/メモリ量を削減できます。ここでは特定列の読み込み方法を紹介し、Kaggle Datasetにある「GeoNames database」を使い「全列読み込み&列抽出」した場合と「特定列読み込み」をした場合の計算時間、メモリ量を比較します。
Pandasで特定列の読み込み方法
pandas.read_csv関数にはusecolsオプションがあり読み込みたい列の
- 列名のリスト
- 列番号のリスト
を与えるとその列だけ読み込むことができます。例えば「ID」「Status」「Contents」の3列があるデータの「ID」「Status」のみを読み込みたい場合は
import pandas as pd data = pd.read_csv('data.csv', usecols=['ID', 'Status'])
とすると「ID」「Status」だけを読み込みます。
環境
Windows 7(CPU: Core i5-2500K, Mem: 32GB)にAnaconda 4.4.0をインストールして実行しています。なお、インストールされたPandasのバージョンは0.20.3でした。Anacondaがインストールしている環境であればOSに関係なく動くと思います。
使用例
データセット
分析コンペプラットフォームKaggle内にオープンデータをまとめた「Kaggle Datasets」があります。今回はその中の各地と緯度、経度をまとめた「GeoNames database」というデータセットを使っています。
実際にデータをダウンロードしたい方はKaggleにログインし「GeoNames database」 > 「Data」のページで”Download All”でダウンロードできます。
ダウンロードしたファイルを解凍すると4つのファイルができます。今回は「geonames.csv」というCSVファイルを使って評価します。geonames.csvは11,540,326行×19列のデータで約1.5GBあります。今回はこのデータの
- geonameid: 地点ID
- asciiname: 地点名
- latitude: 緯度
- longitude: 経度
を読み込んでみます。
実行例
まず、全列読み込み
import pandas as pd geo_data_file = 'geonames.csv' geo_data = pd.read_csv(geo_data_file, dtype='object') geo_data = geo_data[['geonameid', 'asciiname', 'latitude', 'longitude']]
で実行してみます。3回実行した時の実行時間と最大メモリ量の平均値は58.5秒、7.1GBでした。
次に特定列読み込み
import pandas as pd geo_data_file = 'geonames.csv' geo_data = pd.read_csv( geo_data_file, dtype='object', usecols=['geonameid', 'asciiname', 'latitude', 'longitude'] )
だと3回実行した時の実行時間と最大メモリ量の平均値は36.2秒、3.0GBでした。
分析に使う列が決まっている場合にはread_csv関数、read_table関数のusecolsオプションを使って特定列のみ読み込むことで計算量/メモリ量ともに削減できることが分かります。
参考情報
- Pandas documentation: pandas.read_csv