[pandas] 19. 複数のwebページからTable を取得しデータを集計する

Pandas

はじめに

pandasで複数のWebページから複数のTableを取得し、そのTableの一部のデータを集計する方法について紹介する。ここでは、例として、2019シーズンのサッカーくじtotoの結果を利用する。

解説

モジュールのインポート

webページからTableを読み込む

urlに読み込みたいTableが存在するwebページのurlを記載する。Tableの読み込みは、pd.read_html(url)でできる。DataFrameのリストが返ってくるので、リストをスライスして希望のTableを取得する。ここで取得したTableは下記のようになる。

開催日競技場予想チーム
開催日競技場Noホーム試合結果アウェイくじ結果
012/07埼玉1浦和2-3G大阪2
112/07アイスタ2清水1-0鳥栖1
212/07豊田ス3名古屋0-1鹿島2
312/07札幌ド4札幌1-2川崎2
412/07Eスタ5広島1-0仙台1
512/07ノエスタ6神戸4-1磐田1
612/07日産ス7横浜M3-0F東京1
712/07サンアル8松本1-1湘南0
812/07昭和電ド9大分0-2C大阪2
912/08とうスタ10福島1-2群馬2
1012/08藤枝サ11藤枝1-0北九州1
1112/08いわスタ12岩手1-1讃岐0
1212/08長野U13長野1-0熊本1

くじ結果の集計

くじ結果は一番右の列のデータなので、ilocを使ってそのデータをSeriesとして取得する。ilocによるデータの取得については下記で解説した。

[pandas] 4. DataFrameにおけるデータの選択(loc, iloc)
DataFrameにおいて、loc, ilocを用いてデータを選択する方法について説明する。

ここでは、得られたSeriesに対して、value_countsを用いて要素のカウントを行った。

得られたSeriesはマルチインデックスをもつSeriesであり、このままDataFrameにするとデータの選択に苦労するので、今のうちにカラム名を変更する。変更は、r_1141.rename(‘1141’)のようにすることでできる。
Seriesであるr_1141をpd.DataFrame(r_1141)でDataFrameに変換すると下記のようになる。
ちなみに、0が引き分けで1がホームチームの勝ち、2がアウェイチームの勝ちを意味する。

1141
16
25
02

for文による繰り返しによるデータの取得

上記のデータは1141回目のtotoの結果だったが、次は、2019シーズンの他の回のtotoの結果を取得する。

回数に該当する部分を+str(i)+として異なるwebページを選択する。
上記の方法で取得したデータをpd.concat([r_1141, df_result], axis=1)のようにすることでデータを追加していく。
concatによるデータの追加については下記で説明した。

[pandas] 14. Series, DataFrameの連結(.concat())
Series, DataFrameを連結することのできる.concat()について説明する。

最終的に得られるTableは下記のようになる。縦長グラフになるように.Tで転置したDataFrameを表示している。

012
11412.06.05.0
11402.08.03.0
11394.06.03.0
11371.03.09.0
11353.08.02.0
11342.06.05.0
11334.07.02.0
11313.06.04.0
11263.05.05.0
11257.03.03.0
11213.08.02.0
11195.06.02.0
11174.07.02.0
11154.03.06.0
11134.04.05.0
11114.05.04.0
11104.08.01.0
11081.07.05.0
11074.06.03.0
1106NaN6.07.0
11054.08.01.0
11045.06.02.0
11031.05.07.0
11012.08.03.0
10994.06.03.0
10984.06.03.0
10975.06.02.0
10962.07.04.0
10944.05.04.0
10922.08.03.0
10902.08.03.0
10885.04.04.0
10862.08.03.0
10844.02.07.0
10823.07.03.0
10794.03.06.0
10785.02.06.0
10771.07.05.0
10751.04.08.0
10731.06.06.0
10717.03.03.0

データの集計

.sum(axis=1)で0,1,2それぞれの合計値を取得することができる。

結果の表示

参考

pandas.Series.value_counts — pandas 1.0.2 documentation
pandas.concat — pandas 1.0.3 documentation
コードをダウンロード(.pyファイル)コードをダウンロード(.ipynbファイル)

コメント