
仕事でExcelでデータを分析しているんだけど、VLOOKUPが終わるのに1時間くらいかかる!!
この待ち時間がとても無駄な気がする。。。

Pythonでやったら一瞬なんじゃない?
先日、上記のような会話をしていました。私の友達のように思う人も少なくないと思います。最近では扱うデータの量も多いし、複数の情報(Excel)を同時に見ないといけないくて大変と思ったりもするでしょう。この記事では、
- Pythonでどうやってやるの?
- どれくらい速くなるの?
のような疑問に答えられればなと思います。
この記事をみて、少しでもExcel作業からプログラミングに興味が出る人が増えたらいいなと思っています。
注意
この記事ではPythonのインストール方法、Pythonの基本構文の書き方などは説明していません。
対象のデータの説明
Kaggle(データ分析コンペ)のPredict Future Salesのデータを使ってみます。Predict Future Salesでは次の月の売上数を予測するコンペで、以下のようなデータがあります。
- 売上(sales.train.csv):約100万データ
- 日付
- 商品ID
- 店舗ID
- 商品価格
- 売れた個数
- 商品(items.csv):約2万データ
- 商品ID
- 商品名
- 表品カテゴリID
- 商品カテゴリ(item_categories.csv):84データ
- 商品カテゴリID
- 商品カテゴリ名
- 店舗(shops.csv):60データ
- 店舗ID
- 店舗名
Excelでやりたい内容
やりたいことは、売上データに商品カテゴリの情報を結びつけることです。以下の画像の赤枠の部分を埋めることです。

これはVLOOKUP関数を使うことで実現できます。 手順としては
- 商品データに商品カテゴリデータを使って商品カテゴリ名を紐づける
- 売上データに商品データを使って商品カテゴリ名を紐づける
です。具体的には、
商品データ 商品カテゴリデータ
商品データに商品カテゴリ名の列を追加し、以下の式を記述することで実現でき、オートコンプリート機能を使うことで全ての行に対して商品カテゴリ名を結びつけることができます。
=VLOOKUP(C2,商品カテゴリ!$A$2:$B$85,2,FALSE)
次に売上データに商品カテゴリの列を追加し、以下の式を記述することで実現でき、上と同様にオートコンプリート機能を使うことで全ての行に対して商品カテゴリ名を結びつけることができます。
=VLOOKUP(C2,商品!$A$2:$D$22171, 4,FALSE)
Pythonでやるには?
Excelと同様のことを行うにはpandasというライブラリを使うと簡単に実現できます。
pandas
プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。特に、数表および時系列データを操作するためのデータ構造と演算を提供する。(wikipediaより)
まずは完成系から、
import pandas as pd
shops = pd.read_csv('店舗.csv')
items = pd.read_csv('商品.csv')
item_categories = pd.read_csv('商品カテゴリ.csv')
sales = pd.read_csv('売上.csv')
df = pd.merge(items, item_categories, on='商品カテゴリID', how='left')
df = pd.merge(sales, df, on='商品ID', how='left')
df.to_csv('売上(商品カテゴリ付き).csv', index=False)
大切なのは、
pandas.merge()
をつかうこと
です。pandas.merge()
では指定したデータを結合することができます。Excelで行っていたことは以下のようにすることで実現することができます。
- 商品データと商品カテゴリデータを商品カテゴリIDを使って結合する
- 1で作られたデータと売上データを商品IDを使って結合する
pandas.merge()
は、第一引数に1つ目のデータ、第二引数に2つ目のデータを指定します。on
にはキーとする列を指定します。(商品と商品カテゴリであれば商品カテゴリID)
また、キーの名前がデータによって違う場合には left_on
、right_on
を使いそれぞれの列名を指定することもできます。
最後にhow
は結合方法を指定します。ここではleft
を指定しますが、他の結合方法を知りたい場合は、こちらのサイトなどを参考にするとイメージが掴めるかもしれません。
どれくらい速くなるの?
以下の条件で速度を測ってみました。
- Excel:一つ目のVLOOKUPを書いたのち、セルの右下をダブルクリック(オートコンプリート機能)した瞬間に開始、表示された瞬間に終了として計測
- Python:結合部分にかかる時間を計測
Excel | Python | |
1回目 | 2.82秒 | 0.56秒 |
2回目 | 2.74秒 | 0.53秒 |
3回目 | 2.64秒 | 0.52秒 |
平均 | 2.73秒 | 0.54秒 |
単純な数値で見るとPythonの方が約5倍速い結果となりました。(Excelはもっと時間かかると思ってた。。。)
Excelで大量データを扱う時、開く、データの消去、保存など他の部分でPCが固まってしまうことが多いなと思いました。Pythonでは操作におけるストレスがないので計測結果以上の効率化にはなるかなぁと思いました。
コメント