Pandasでデータの特定列を読み込む方法

投稿者: | 2018-03-17

表形式のデータを分析する際は

  1. いったん全列読み込む
  2. 分析に必要な列のみ抽出する

ことが多いと思います。データが大きくなければ問題ないですがデータが大きい場合には時間、メモリを余分に消費してしまいます。

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オプションを使って特定列のみ読み込むことで計算量/メモリ量ともに削減できることが分かります。

参考情報

スポンサーリンク


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です