「WebスクレイピングでWebページのデータは取得できたけど、データの整形や分析のやり方が分かりません。」
「Pandasって何ができるの?使い方を知りたい。」
上記の疑問にお答えします。
Pandasを使えば、Webスクレイピングによって取得したデータを整形し、CSVファイルなどで出力することができます。
この記事では、WebスクレイピングにおけるPandasの基本的な使い方を解説します。
Python初心者の方にも分かるように解説しているので、これからWebスクレイピングを始める方でも、データの前処理の仕方が身に付きます。
具体的には、以下について説明します。
- Pandasとは
- Pandasの基礎知識
- Pandasの準備
- Pandasの使い方
「偉そうに語るおまえは誰やねん。」と思われるので、私のことも少し紹介させてください。
たいらーのプロフィール
- 文系四大出身。ソフトウェア開発の経験はなしですが、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があります。
それぞれ説明します。
・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分で完了!】』を参考に、まず環境構築から始めましょう。
4.Pandasの使い方【競馬サイトを題材に実践】
準備ができたら実際にPandasを使ってみましょう。
今回は実践がイメージしやすいように、競馬サイトのWebスクレイピングを題材としています。
実際に次の流れに沿って説明します。
- データの読み込み
- データの整形
- データの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サイトや書籍で勉強するのは苦手だなぁ。」という方は、動画でスクレイピングが学べるUdemyがおすすめです。
スクレイピングやPythonの動画教材が充実しているので、あなたに合った講座が見つかります。
初めて利用される方は、割引適応されることがあるので一度覗いてみてください。
ご清聴ありがとうございました。