見出し画像

PythonでMリーグ選手の成績データを加工する

前回まではスクレイピングしてデータを取得しました

6行でデータを取得しました。
データを持っていることを前提にしてこの記事では進めていきます。
まだデータを取得していない方は、下の記事からデータ取得の記事に行くとデータを取得する方法が分かりますので参考にしてみてください。

データ分析するためにデータを加工しよう!

前回はチームごとにcsvファイルにしました。
複数ファイルですので、データ分析する上では一つのテーブル形式にしたいところです。
今回は、チームごとに分けられていた成績データのファイルを一つのデータにまとめたいと思います。

コードは15行の簡単レシピ!

処理の仕方は、データを読み込み、データフレームにどんどん追加してい苦処理を繰り返します。
コードの長さは15行の短さです。
処理の中には、チームの所属を表す列を追加、ライブラリの宣言などしている部分もあるため、データを一つにまとめあげる処理は10行ほどです。
全体のコードは以下です。

import pandas as pd
import glob
import re

flist = glob.glob('data/*.csv')

df = pd.DataFrame()
for i in flist:
   data = pd.read_csv(i)
   data = data.T
   data.columns = data.iloc[0]
   data = data.iloc[1:]
   data.insert(0,'選手名',data.index)
   data.insert(0,'チーム',re.search('(?<=\/).*(?=\.)', i).group())
   data.reset_index(drop=True,inplace=True)
   df = pd.concat([df,data])

df.to_csv('MLeague_players.csv',index=False)

処理のポイントを見ていきましょう。

まずはインポート!

最初は、ライブラリをインポートします。
pandasはデータ処理用です。
globはディレクトリ操作用に便利なライブラリです。
データのアクセスを一括して行うときに便利です。
reは文字列処理をする際に正規表現などを用いて処理するときに便利です。
この3つのライブラリを用いてデータ加工を行なっていきます。

import pandas as pd
import glob
import re

データの置いてある場所の全てのファイル名を取得

今回使うデータの全ファイル名を取得します。
globは指定した文字列に該当するファイル名を全て取得します。
ここではdataディレクトリにあるcsvファイル名を全て取得する処理です。
ファイル名を取ってきているだけですので、ファイルの中身自体は読み込んでいません。
取得したファイル名はリストで格納されます。

flist = glob.glob('data/*.csv')

格納用のデータフレームを用意

今回は読み込んだデータを次々と繋げていくので、まとめるようのデータを持っておく必要があります。
そのための、データを宣言します。
それがデータフレーム型の宣言を以下のようにしておきます。

df = pd.DataFrame()

繰り返し処理でデータを加工して一つにまとめ上げていくぅ!

for文で繰り返して、データを読み込み、加工して、一つのデータとしてまとめ上げていきます。

for i in flist:
   data = pd.read_csv(i)
   data = data.T
   data.columns = data.iloc[0]
   data = data.iloc[1:]
   data.insert(0,'選手名',data.index)
   data.insert(0,'チーム',re.search('(?<=\/).*(?=\.)', i).group())
   data.reset_index(drop=True,inplace=True)
   df = pd.concat([df,data])

順を追って、処理を説明しておきます。

まずはデータを読み込みます。

for i in flist:
   data = pd.read_csv(i)

for文で回して、iに入っているデータはファイル名の文字列です。
そのため、iでpd.read_csvをすればデータを読み込めます。

データの行列を入れ替えます

data = data.T

data.Tで行と列を入れ替えます。

最初の読み込んだ状態は以下のようなデータです。

選手名	佐々木 寿人	高宮 まり	前原 雄大	藤崎 智
0	試合数	30.00	20.00	21.00	19.00
1	総局数	399.00	241.00	250.00	223.00
2	ポイント	494.10	-246.00	-251.80	-164.80
3	平着	2.10	2.80	2.76	2.63
4	1位	13.00	3.00	4.00	3.00
5	2位	6.00	4.00	5.00	6.00
6	3位	6.00	7.00	4.00	5.00
7	4位	5.00	6.00	8.00	5.00
8	トップ率	0.43	0.15	0.19	0.15
9	連対率	0.63	0.35	0.42	0.47
10	ラス回避率	0.83	0.70	0.61	0.73
11	ベストスコア	94000.00	47600.00	56100.00	58900.00
12	平均打点	7788.88	5807.89	5374.00	5702.70
13	副露率	0.18	0.19	0.23	0.17
14	リーチ率	0.31	0.22	0.20	0.17
15	アガリ率	0.24	0.15	0.20	0.16
16	放銃率	0.10	0.13	0.10	0.14
17	放銃平均打点	7380.00	4915.62	7440.74	5187.50

列が選手名、行に成績の種類になっていて各選手名を列で持ちたいのです。
そのため、行と列を入れ替える必要がございます。
行と列をdata.T入れ替えた結果がこちらになります。

	0	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16	17
選手名	試合数	総局数	ポイント	平着	1位	2位	3位	4位	トップ率	連対率	ラス回避率	ベストスコア	平均打点	副露率	リーチ率	アガリ率	放銃率	放銃平均打点
佐々木 寿人	30.0	399.0	494.1	2.1	13.0	6.0	6.0	5.0	0.43	0.63	0.83	94000.0	7788.88	0.18	0.31	0.24	0.1	7380.0
高宮 まり	20.0	241.0	-246.0	2.8	3.0	4.0	7.0	6.0	0.15	0.35	0.7	47600.0	5807.89	0.19	0.22	0.15	0.13	4915.62
前原 雄大	21.0	250.0	-251.8	2.76	4.0	5.0	4.0	8.0	0.19	0.42	0.61	56100.0	5374.0	0.23	0.2	0.2	0.1	7440.74
藤崎 智	19.0	223.0	-164.8	2.63	3.0	6.0	5.0	5.0	0.15	0.47	0.73	58900.0	5702.7	0.17	0.17	0.16	0.14	5187.5

これで、選手毎の成績データが取り扱いやすい形になりました。

列名を指定していく

先程の行と列を入れ替えた結果を見ると、列が0、1、2・・・と続いています。
列名が指定されていないので、列名を指定していきます。

 data.columns = data.iloc[0]

data.iloc[0]で一番上の行を列名としています。

2行目以降はデータとして格納していく。

列名をして、最初の行は列名のデータがまだ入っています。
2行目以降のデータを格納し直すことで、列名部分を外していきます。

data = data.iloc[1:]

選手名とチーム名を追加していくぅ!

実はindexで選手名を持っていて、チームはデータとして持っていないので列に追加していきます。
選手名は単純にindexを新しい列に格納すれば良いです。
チーム名は読み込んだデータにないので、ファイル名にチーム名を仕込んでおいたので、上手くファイル名を使いますw

   data.insert(0,'選手名',data.index)
   data.insert(0,'チーム',re.search('(?<=\/).*(?=\.)', i).group())

iに入っているファイル名から正規表現で/と.の間の文字列を取ります。
つまり、チーム名だけ取り出します。
正規表現に関する詳しい説明はこの記事では割愛します。
別の記事か下記書籍がわかりやすいので参考にしてください。

indexを外して、データフレームに繋げていくぅ!

indexはいらないのでindexを外していきます。
(ここはなくても良い)
最後に最初に用意したデータフレーム形式のデータにデータを縦に繋げていきます。
これを繰り返していくことで、データを次々と繋げていきます。

   data.reset_index(drop=True,inplace=True)
   df = pd.concat([df,data])

最後は保存して終了!

最後はto_csvメソッドでcsv保存して終了です。

df.to_csv('MLeague_players.csv',index=False)

以上でMリーグの全選手の成績データを一つの表形式にしてcsvファイルに保存できました。
これで、チーム間のデータ分析もできますね!

データ加工でよく使うpandasのテキストを参考にいくつか紹介します。

データ分析を行うと必ずと言っていいほどpandasuを使うことになります。
そこでいくつか参考になるpandas本を下記に貼っておきます。

今回のデータはここにあります!(有料)

処理の仕方とかどうでもいい!
データだけ欲しいという方はこちらをどうぞw

ここから先は

0字 / 1ファイル

¥ 200

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