Python初心者のためのPandas入門【競馬サイトを題材にCSV出力まで解説】

ハッカーの部屋Python
スポンサーリンク
スポンサーリンク

「WebスクレイピングでWebページのデータは取得できたけど、データの整形や分析のやり方が分かりません。」

「Pandasって何ができるの?使い方を知りたい。」

上記の疑問にお答えします。

Pandasを使えば、Webスクレイピングによって取得したデータを整形し、CSVファイルなどで出力することができます。

この記事では、WebスクレイピングにおけるPandasの基本的な使い方を解説するので、これからWebスクレイピングを始める方でも、データの前処理の仕方が身に付きます。

具体的には、以下について説明します。

  • Pandasとは
  • Pandasの基礎知識
  • Pandasの準備
  • Pandasの使い方

 

「偉そうに語るおまえは誰やねん。」と思われるので、私のことも少し。

私のプログラミング歴は約5年で、本職での開発経験はありませんが、一応、IT業界に身を置いています。

今でもPythonなど、独学でプログラミングを勉強しつつ、そのスキルを活かして仕事の効率化を図ったり、ゲームをつくったりしています。

記事の後半で説明するPandasの使い方では、実際の競馬サイトをイメージした使い方を例に説明しています。(競馬を題材にしたのは、私の趣味です。)

具体的なものをイメージできたほうが、理解が深まると思いますので、実際にこの記事を読みつつ、手を動かしてみてください。

 

 

1.Pandasとは

Pandasとは、データ分析に必要な機能を備えたPythonのデータ解析用のライブラリです。

列と行で構成されたデータの整理や分析が得意で、データの追加や編集、数値計算も可能です。Microsoftのエクセルをイメージしてもらえると分かりやすいと思います。

 

・Pandasでできること

Pandasでは主に次のことができます。

  • データの読み込み
  • データの整形と分析
  • データの出力

 

Pandasは、CSVやExcel、テキストなど様々な形式のデータを読み込むことができます。また、データの条件を指定して値の抽出をしたり、行と列の追加&削除するなど、たくさんの機能が用意されているので、状況に応じたデータ整形とデータ分析をすることができます。

手元でデータを確認したい場合や、他のインプットデータとして使いたい場合などに備えて、CSVやExcelファイルとして出力することも可能です。

 

・Pandasのメリット

Pandasのメリットは、「Pandasでできること」でも触れたように、様々なデータに対応している点です。

Pandasでは、数値やテキストなどデータ型の異なるデータも、ひとつのDataFrame(説明は後述)で一緒に扱うことができます。

さらに欠損値(ある項目に対して欠落した値)の処理ができることもメリットの一つです。

Pandasでは、欠損値の削除や補完など、欠損値の処理を支援する機能が提供されているので、柔軟なデータ処理が可能です。

 

2.Pandasの基礎知識

Pandasを使う上で理解すべき知識として、SeriesとDataFrameがあります。

ここではこの2つについて説明します。

 

・SeriesとDataFrame

Pandasでは主に、一次元、二次元の配列で構成されたデータを取り扱います。

配列とは、同じ分類のデータのまとまりです。(少なくともこの記事では、この考え方で問題ありません。)

 

例えば、馬体重という分類があって、個々の馬のデータが一つにまとまっているものをイメージしてもらうと、わかりやすいと思います。

このようなデータ構造を一次元配列といい、PandasではSeriesと呼びます。

以下は、馬体重を例にしたソースコードです。

※ソースコードの説明はコメントを参照して下さい。

 

import pandas as pd  #Pandasを呼び出し

bataijuu = pd.Series([462, 518, 440])  #bataijuuに一次配列の馬体重データを3つ格納

print(bataijuu)  #格納したデータを表示

#実行結果
0    462
1    518
2    440
dtype: int64

 

実行結果で表示されている左端の縦の数字をIndex(インデクス)と呼び、各データと関連付けされています。

ただ、実際は、複数の分類があると思います。

例えば、表のなかに馬名と馬体重という分類があるケースだと以下のようになります。

 

import pandas as pd

df = pd.DataFrame([['uma1', 462],['uma2', 518],['uma3', 440]],columns =['馬名','馬体重'])

print(df) #格納したデータを表示

#実行結果
     馬名  馬体重
0  uma1  462
1  uma2  518
2  uma3  440
dtype: int64

 

「馬名+馬体重」のようにSeriesを複数持つデータ構造を二次元配列といい、PandasではDataFrameと呼びます。

DataFrameでは、横軸のデータの分類をColumn(カラム)と呼びます。

 

3.Pandasの準備

Pandasとは何かなど、基本的なところの説明が終了しました。

これらの基礎を押さえておけば、実際の作業も理解できると思います。

 

なので、さっそくPandasをインストールしましょう。

以下のようにコマンドプロンプトに入力し、実行しましょう。

「Successfully installed ~」と表示されれば成功です。

 

py -m pip install pandas

 

Pythonの環境構築がまだの方は、『Python3のインストール方法【導入は10分で完了!】』を参考にまず環境構築から始めましょう。

Python3のインストール方法【導入は10分で完了!】
Python3のインストール方法についてステップバイステップで説明しています。この記事に沿って手を動かしてもらえれば、迷うことなくインストールができます。

 

4.Pandasの使い方【競馬サイトを題材に実践】

準備ができたら実際にPandasを使ってみましょう。

今回は実践がイメージしやすいように、競馬サイトのWebスクレイピングを題材としています。

例題は次の流れで説明します。

  1. データの読み込み
  2. データの整形
  3. データのCSV出力

対象データは本サイトの出馬表サンプルを使います。

出馬表サンプル

 

1.データの読み込む

まず、データの読み込みを行います。

以下のソースコードを実行してみてください。出馬表のデータが取り込めていることが分かると思います。

import pandas as pd

url = 'https://umano-ie.com/racesample/' #取得対象ページのURLを格納

df = pd.read_html(url) #対象ページの表を取得

print(df[0]) #取得データを表示

#実行結果
   0   1     2   3     4     5       6        7      8   9
0  枠  馬番  馬名  性齢    斤量    騎手      厩舎      馬体重    オッズ  人気
1  1   1    ラジャーバローズ  牡3  55.0    真中   角井(栗)  486(-8)   34.0   6
2  2   2    ワゲネリアン  牡3  55.0    福長   智道(栗)  450(-2)    9.5   4
3  3   3    レイドオロ  牡3  55.0  ロメーロ  富士澤(美)  480(-4)   13.7   5
4  4   4    ムカヒキ  牡3  55.0   河和田   智道(栗)  502(+4)    2.3   1
5  5   5    デラメンテ  牡3  55.0  D.ムロ   堀井(美)  484(-2)    5.4   3
6  6   6    ワンアンドオイリー  牡3  55.0    横乗   橋田(栗)  482(+4)  118.7   8
7  7   7    クサリ  牡3  55.0    竹豊   佐木(栗)  478(-2)   43.5   7
8  8   8    ディープゲリランテ  牡3  55.0   磐田康   小木(栗)  496(-6)    2.4   2

 

2.データの整形

今回はデータ整形の例として、不要なデータを削除します。

データを取得するときに、あらかじめ不要なデータが決まっているなら削除しましょう。今後の作業がやりやすくなります。

データを削除するときは、dropメソッドを使用します。

※メソッドについては、とりあえずPandasのなかで使える機能くらいに理解しておいてください。

 

特定のColumnを削除するときは、以下のように書きます。例として騎手データを削除しています。

import pandas as pd

url = 'https://umano-ie.com/racesample/'
df = pd.read_html(url)

df[0]= df[0].drop(df[0].columns[[5]], axis=1) #dropメソッドでColumnの5番目(=騎手)を削除

print(df[0])

#実行結果
   0   1     2   3     4       6        7      8   9
0  枠  馬番  馬名  性齢    斤量      厩舎      馬体重    オッズ  人気
1  1   1    ラジャーバローズ  牡3  55.0   角井(栗)  486(-8)   34.0   6
2  2   2    ワゲネリアン  牡3  55.0   智道(栗)  450(-2)    9.5   4
3  3   3    レイドオロ  牡3  55.0  富士澤(美)  480(-4)   13.7   5
4  4   4    ムカヒキ  牡3  55.0   智道(栗)  502(+4)    2.3   1
5  5   5    デラメンテ  牡3  55.0   堀井(美)  484(-2)    5.4   3
6  6   6    ワンアンドオイリー  牡3  55.0   橋田(栗)  482(+4)  118.7   8
7  7   7    クサリ  牡3  55.0   佐木(栗)  478(-2)   43.5   7
8  8   8    ディープゲリランテ  牡3  55.0   小木(栗)  496(-6)    2.4   2

 

Indexを削除したい場合は以下のとおりです。

import pandas as pd

url = 'https://umano-ie.com/racesample/'
df = pd.read_html(url)

df[0]= df[0].drop(df[0].index[[5]]) #dropメソッドでIndexの5番目(=デラメンテ)を削除

print(df[0])

#実行結果
   0   1     2   3     4     5       6        7      8   9
0  枠  馬番  馬名  性齢    斤量    騎手      厩舎      馬体重    オッズ  人気
1  1   1    ラジャーバローズ  牡3  55.0    真中   角井(栗)  486(-8)   34.0   6
2  2   2    ワゲネリアン  牡3  55.0    福長   智道(栗)  450(-2)    9.5   4
3  3   3    レイドオロ  牡3  55.0  ロメーロ  富士澤(美)  480(-4)   13.7   5
4  4   4    ムカヒキ  牡3  55.0   河和田   智道(栗)  502(+4)    2.3   1
6  6   6    ワンアンドオイリー  牡3  55.0    横乗   橋田(栗)  482(+4)  118.7   8
7  7   7    クサリ  牡3  55.0    竹豊   佐木(栗)  478(-2)   43.5   7
8  8   8    ディープゲリランテ  牡3  55.0   磐田康   小木(栗)  496(-6)    2.4   2

 

お気づきの方もいるかと思いますが、Columnが数字になっており、Indexの0番目に本来はColumnにあって欲しい情報が入ってます。

このままだと不格好なので、整形します。

import pandas as pd

url = 'https://umano-ie.com/racesample/'
df = pd.read_html(url)

df[0].columns = ['枠', '馬番', '馬名', '性齢', '斤量', '騎手', '厩舎', '馬体重', 'オッズ', '人気'] #Columnを追加
df[0]= df[0].drop(df[0].index[[0]]) #dropメソッドでIndexの0番目を削除

print(df[0])

#実行結果
   枠 馬番         馬名  性齢    斤量    騎手      厩舎      馬体重    オッズ 人気
1  1  1   ラジャーバローズ  牡3  55.0    真中   角井(栗)  486(-8)   34.0  6
2  2  2     ワゲネリアン  牡3  55.0    福長   智道(栗)  450(-2)    9.5  4
3  3  3      レイドオロ  牡3  55.0  ロメーロ  富士澤(美)  480(-4)   13.7  5
4  4  4       ムカヒキ  牡3  55.0   河和田   智道(栗)  502(+4)    2.3  1
5  5  5      デラメンテ  牡3  55.0  D.ムロ   堀井(美)  484(-2)    5.4  3
6  6  6  ワンアンドオイリー  牡3  55.0    横乗   橋田(栗)  482(+4)  118.7  8
7  7  7        クサリ  牡3  55.0    竹豊   佐木(栗)  478(-2)   43.5  7
8  8  8  ディープゲリランテ  牡3  55.0   磐田康   小木(栗)  496(-6)    2.4  2

 

3.データのCSV出力

Webページから出馬表を取り込み、データを整形することができました。

このままでも良いのですが、ファイル出力してエクセルなどでデータを使いたくなるケースが出てくると思います。

そんな時は、DataFrame.to_csv() メソッドを使用して、取得したデータをCSV形式でファイル出力しましょう。

 

ソースコードは以下のとおりです。

import pandas as pd

url = 'https://umano-ie.com/racesample/'
df = pd.read_html(url)

df[0].columns = ['枠', '馬番', '馬名', '性齢', '斤量', '騎手', '厩舎', '馬体重', 'オッズ', '人気'] #Columnを追加
df[0]= df[0].drop(df[0].index[[0]]) #dropメソッドでIndexの0番目を削除
df[0]= df[0].drop(df[0].columns[[5]], axis=1) #dropメソッドでColumnの5番目(=騎手)を削除

print(df[0])

df[0].to_csv('sample.csv', encoding='shift_jis') #実行しているパス直下にCSVファイルを生成

 

12行目のかっこの中身の説明ですが、左の”sample.csv”でファイル名を指定し、右の”encoding=’shift_jis’”が文字コードを指定しています。

エクセルで扱いたい場合、文字コードはシフトJISがよいでしょう。

エクセルで扱うことがなければ、UTF-8が無難です。

 

sample.csvが出力されているので、中身を確認してみましょう。

意図した内容になっていれば成功です。

 

5.まとめ

以上、Python初心者のためのPandas入門でした。

データを取得からCSV形式でのファイル出力まで、基本的なPandasの使い方は理解して頂けたと思います。

Pandas以外にも、BeautifulSoupやRequestsなど、Webスクレイピングに必要なライブラリはたくさんあります。

「もっとWebスクレイピングの知識を深めたい!」という方に向けて、スクレイピングについての知識や学習方法などをまとめた『【仕事でPython活用】スクレイピングとは?やり方・学習方法を解説』を用意しました。

スクレイピングは、仕事やプライベートに活用できるので、是非ご覧ください。

【仕事でPython活用】スクレイピングとは?やり方・学習方法を解説
仕事のデータ分析に役立つWebスクレイピングを解説しています。Pythonによるスクレイピングのやり方や学習方法を初心者目線で説明しているので、今からスクレイピングを始める方は必読です。

ご清聴ありがとうございました。