これまで2022シーズンのJ1全306試合のスタッツデータをWebスクレイピングで収集する方法を紹介しました。
今回は、収集したデータを使ってPythonライブラリ「Pandas」の基本的な使い方を紹介します。
目次
データを読み込む
#ライブラリをインストールする
import pandas as pd
import os
#csvファイルのディレクトリを変数に格納する
wd = os.getcwd() #現在作業をしているディレクトリを取得して変数に格納する
data_dir = os.path.join(wd, "dataset") #datasetフォルダのディレクトリを作成して変数に格納する
df_stats_csv = os.path.join(data_dir, "df_stats.csv")
#csvファイルを読み込んでデータフレームを作成する
df_stats = pd.read_csv(df_stats_csv)
データを確認する
先頭3行を確認する
df_stats.head(3)
末尾3行を確認する
df_stats.tail(3)
行数、列数を確認する
df_stats.shape
カラム名を確認する
df_stats.columns
データ型を確認する
df_stats.dtypes
要約統計量を確認する
df_stats.describe()
データを抽出する
行番号を指定して任意の行のみを表示する
df_stats.iloc[6] #5行目の全ての列を出力する
df_stats.iloc[2:5] #1~4行目の全ての列を出力する
df_stats.iloc[[6, 11], :] #5、10行目の全ての列を出力する
カラム名を指定して任意の列のみを表示する
df_stats[['日付', 'チーム名', '対戦相手', '勝ち点']]
列番号を指定して任意の列のみを表示する
df_stats.iloc[:, 0:11] #1~10列目までを出力する
df_stats.iloc[:, [0,6,71]] #特定の列を指定して出力する
任意のインデックス名、カラム名のレコードのみを表示する
df_stats.loc[[0, 6, 11], ['日付', 'チーム名', '勝ち点']]
行番号、列番号で特定の位置の値を取得する
df_stats.iat[2, 5] #3行目、4列目の値を取得する
インデックス名、カラム名で特定の位置の値を取得する
df_stats.at[2, '観客(人)'] #3行目、4列目の値を取得する
条件を満たす行のみを表示する(queryメソッド)
df_stats.query('チーム名 == "横浜F・マリノス"') #チーム名「横浜F・マリノス」のレコードのみ取得する
df_stats.query('チーム名 == "横浜F・マリノス" and 勝ち点 == 3') #&条件で複数指定する
df_stats.query('チーム名 == "横浜F・マリノス" or チーム名 == "川崎フロンターレ"') #or条件で複数指定する
条件を満たす行のみを表示する(queryメソッドを利用しない方法)
df_stats[(df_stats['チーム名'] == "横浜F・マリノス") & (df_stats['勝ち点'] == 3)] #横浜F・マリノスの試合かつ勝ち点3のレコードのみ取得する
データを集計する
合計値(SUM)、平均値(MEAN)、中央値(MEDIAN)を算出する
df_stats[['チーム名','勝ち点']].groupby('チーム名').sum() #チーム別:勝ち点合計
df_stats[['チーム名','勝ち点']].groupby('チーム名').mean() #チーム別:勝ち点平均
df_stats[['チーム名','勝ち点']].groupby('チーム名').median() #チーム別:勝ち点中央値
最大値(MAX)、最小値(MIN)を算出する
df_stats[['チーム名','シュート']].groupby('チーム名').max() #チーム別:シュート数の最大値
df_stats[['チーム名','シュート']].groupby('チーム名').min() #チーム別:シュート数の最小値
標準偏差(STD)、分散(VAR)を算出する
df_stats[['チーム名','総走行距離(m)']].groupby('チーム名').std() #チーム別:総走行距離の標準偏差
df_stats[['チーム名','総走行距離(m)']].groupby('チーム名').var() #チーム別:総走行距離の分散
値をクロス集計をする
#チーム×Home/Away別:勝ち点合計
df_stats[['チーム名', 'Home/Away', '勝ち点']].groupby(['チーム名', 'Home/Away']).sum()
値を時系列集計する
#チーム×Home/Away別:勝ち点合計
df_stats[['日付', '得点']].resample('M').sum()
件数をクロス集計する
pd.crosstab([df_stats['チーム名'], df_stats['Home/Away']], df_stats['勝敗'], margins=True)
データを加工する
列同士の四則演算で新しい特徴量を作成する
df_stats['得失点差'] = df_stats['得点'] - df_stats['失点']
特定の条件に当てはまる場合に新しい特徴量を作成する①
df_stats['観客(1万人超)'] = np.where(df["観客(人)"] > 10000, 1, 0)
特定の条件に当てはまる場合に新しい特徴量を作成する②
conditionlist = [
(df_match['得点'] > df_match['失点']),
(df_match['得点'] == df_match['失点']),
(df_match['得点'] < df_match['失点'])]
choicelist = ['勝ち', '引き分け', '負け']
df_match['勝敗'] = np.select(conditionlist, choicelist, default='Not Specified')