見出し画像

30行でスタメンデータを集計してデータフレームにまとめる

前回スタメンデータをスクレイピングして各打順ごとの出場回数を集計してグラフにしました。
グラフにしてみることがメインでしたので、集計してそのまま可視化していましたが、選手が各打順で出場回数が何回か見たいこともあると思います。
また、なによりもデータとして持てる形にしておきたいことも多いです。
そこで、今回はプロ野球のスタメンデータを使って、各選手(1軍で出場機会があった選手)の打順ごとの出場回数をデータフレーム形式で持つようにします。

ライブラリをインポート

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

URL作成用のデータを用意

各球団のURLにアクセスするため、URLの構造から各球団を分けるURL部分をリストで持ちます。
また、URLの変わらない部分をbody変数として格納しておきます。

team = ['s','t','g','c','d','yb','bs','m','e','h','f','l']
body = 'https://baseball-data.com/lineup/'

データフレームを初期化

スクレイピングしたデータを格納するためのデータフレームを初期化しておきます。

starter_list = pd.DataFrame()
merge_list = pd.DataFrame()

スタメンデータをスクレイピング

各球団のスタメンデータをスクレイピングして一つのデータフレームにしていきます。

for t in team:
    url = body + t +'.html'
    df = pd.read_html(url)
    df = df[0]
    df = df[:-1]
    df['球団'] = t #球団のアルファベットを球団列として追加
    starter_list = pd.concat([starter_list,df])

スタメンデータを各打順別に集計してデータフレームに格納

先ほどスクレイピングして取得したスタメンデータを各打順ごとに出場回数を選手名をvalue_counts()で集計することで出場回数を求めます。
value_counts()で集計した結果はSeries型のため、indexに選手名、valuesに集計値(出場回数)が入っているため、一時的に容姿したデータフレームに選手名列と打順の出場回数として1番、2番・・・9番列に入れていきます。
一時的に入れたデータフレームとデータ格納用に用意したデータフレームmerge_listに完全外部結合で結合していくことでスタメンに起用された選手は必ずデータフレームに入るようにしています。
出場していないところは欠損値になるので、merge_list.fillna(0,inplace=True)で0にしてあげて完成です。

for i in range(1,10):
    temp_list = pd.DataFrame()
    t = starter_list[str(i)+'番'].value_counts()
    temp_list['選手名'] = t.index
    temp_list[str(i)+'番'] = t.values
    if i == 1:
        merge_list['選手名'] = temp_list['選手名']
        merge_list[str(i)+'番'] = temp_list[str(i)+'番']
    else:
        merge_list = merge_list.merge(temp_list,how = 'outer')

merge_list.fillna(0,inplace=True)

結果

完成したデータフレームはこちら。

今回のコードは30行!

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

team = ['s','t','g','c','d','yb','bs','m','e','h','f','l']
body = 'https://baseball-data.com/lineup/'

starter_list = pd.DataFrame()
merge_list = pd.DataFrame()

for t in team:
    url = body + t +'.html'
    df = pd.read_html(url)
    df = df[0]
    df = df[:-1]
    df['球団'] = t #球団のアルファベットを球団列として追加
    starter_list = pd.concat([starter_list,df])

for i in range(1,10):
    temp_list = pd.DataFrame()
    t = starter_list[str(i)+'番'].value_counts()
    temp_list['選手名'] = t.index
    temp_list[str(i)+'番'] = t.values
    if i == 1:
        merge_list['選手名'] = temp_list['選手名']
        merge_list[str(i)+'番'] = temp_list[str(i)+'番']
    else:
        merge_list = merge_list.merge(temp_list,how = 'outer')

merge_list.fillna(0,inplace=True)

今回のコードとデータはこちらからダウンロードできます。(有料)

今回のコードとデータは下からダウンロードすることができます。
データだけ欲しいという方や実際に動くコードを欲しい、参考にしたい方はご利用ください。

ここから先は

37字 / 2ファイル
この記事のみ ¥ 100

よろしければサポートをよろしくお願いします。サポートいただいた資金は活動費に使わせていただきます。