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

ハッカーの部屋 スクレイピング
スポンサーリンク
スポンサーリンク

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

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

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

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

この記事では、WebスクレイピングにおけるPandasの基本的な使い方を解説します。

Python初心者の方にも分かるように解説しているので、これからWebスクレイピングを始める方でも、データの前処理の仕方が身に付きます。

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

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

 

「偉そうに語るおまえは誰やねん。」と思われるので、私のことも少し紹介させてください。

たいらーのプロフィール

  • 文系四大出身。ソフトウェア開発の経験はなしですが、IT業界に身を置いています。
  • 開発者やユーザーとのパイプ役など、業務にプログラミングスキルを活かす。
  • Pythonは独学で習得。スクレイピングや作業の自動化などに勤しんでいます。

 

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

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

【PR】
”初めての方は割引特典あり!”
Udemyでスクレイピングの動画教材を探す icon

1.Pandasとは

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

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

 

・Pandasでできること

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

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

 

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

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

 

・Pandasのメリット

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

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

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

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

 

2.Pandasの基礎知識

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

それぞれ説明します。

 

・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によるスクレイピングのやり方や学習方法を初心者目線で説明しているので、今からスクレイピングを始める方は必読です。

 

「Webサイトや書籍で勉強するのは苦手だなぁ。」という方は、動画でスクレイピングが学べるUdemyがおすすめです。

スクレイピングやPythonの動画教材が充実しているので、あなたに合った講座が見つかります。

初めて利用される方は、割引適応されることがあるので一度覗いてみてください。

【PR】
”初めての方は割引特典あり!”
Udemyでスクレイピングの動画教材を探す icon

 

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