JFLの試合結果から戦績表を作成

# はじめに

[JFLの試合結果から順位表を作成](https://qiita.com/barobaro/items/84d4811cbb15b023eac2)のつづき

# スクレイピング

前回の[JFLの試合結果から順位表を作成](https://qiita.com/barobaro/items/84d4811cbb15b023eac2)のスクレイピングと同じ

```python
import requests
from bs4 import BeautifulSoup

url = "http://www.jfl.or.jp/jfl-pc/view/s.php?a=1542&f=2020A001_spc.html"

r = requests.get(url)
r.raise_for_status()

soup = BeautifulSoup(r.content, "html.parser")

data = []

for table in soup.find_all("table", class_="table-data"):

    trs = table.find_all("tr")

    th = int(trs[0].th.get_text(strip=True).strip("第節"))

    for i, tr in enumerate(trs[1:], 1):

        tds = [td.get_text(strip=True) for td in tr.find_all("td")]

        data.append([th, i] + tds)
```

# データラングリング

```python
import pandas as pd

df = pd.DataFrame(
    data, columns=["節", "番号", "日にち", "時間", "ホーム", "スコア", "アウェイ", "スタジアム", "備考"]
)

df.set_index(["節", "番号"], inplace=True)

df

df_score = (
    df["スコア"].str.split("-", expand=True).rename(columns={0: "ホーム得点", 1: "アウェイ得点"})
)

df_score["ホーム得点"] = pd.to_numeric(df_score["ホーム得点"], errors="coerce").astype("Int64")
df_score["アウェイ得点"] = pd.to_numeric(df_score["アウェイ得点"], errors="coerce").astype("Int64")

df1 = pd.concat([df, df_score], axis=1).dropna(subset=["ホーム得点", "アウェイ得点"])

# ホームの結果のみ
df_home = df1.loc[:, ["ホーム", "アウェイ", "ホーム得点", "アウェイ得点"]].copy()
df_home.rename(
    columns={"ホーム": "チーム名", "アウェイ": "対戦相手", "ホーム得点": "得点", "アウェイ得点": "失点"}, inplace=True
)
df_home["戦"] = "H"
df_home.head()

# アウェイの結果のみ
df_away = df1.loc[:, ["アウェイ", "ホーム", "アウェイ得点", "ホーム得点"]].copy()
df_away.rename(
    columns={"アウェイ": "チーム名", "ホーム": "対戦相手", "アウェイ得点": "得点", "ホーム得点": "失点"}, inplace=True
)
df_away["戦"] = "A"
df_away.head()

# ホームとアウェイを結合
df_total = pd.concat([df_home, df_away])

df_total

jfl_2020 = [
    "Ｈｏｎｄａ ＦＣ",
    "ソニー仙台ＦＣ",
    "東京武蔵野シティＦＣ",
    "テゲバジャーロ宮崎",
    "ホンダロックＳＣ",
    "ヴェルスパ大分",
    "ＦＣ大阪",
    "ＭＩＯびわこ滋賀",
    "ヴィアティン三重",
    "ＦＣマルヤス岡崎",
    "鈴鹿ポイントゲッターズ",
    "ラインメール青森",
    "奈良クラブ",
    "松江シティＦＣ",
    "いわきＦＣ",
    "高知ユナイテッドＳＣ",
]

df_total

df_total["結果"] = df_total.apply(
    lambda x: f'{x["得点"]}△{x["失点"]}'
    if x["得点"] == x["失点"]
    else f'{x["得点"]}○{x["失点"]}'
    if x["得点"] > x["失点"]
    else f'{x["得点"]}●{x["失点"]}',
    axis=1,
)

df_total

# 戦績表　集計
pv_senseki = df_total.pivot(values="結果", index=["チーム名", "戦"], columns="対戦相手").fillna("")

new_idx = pd.MultiIndex.from_product(
    [jfl_2020, ["H", "A"]], names=pv_senseki.index.names
)

jfl_senseki = pv_senseki.reindex(new_idx, columns=jfl_2020)

jfl_senseki

print(jfl_senseki.to_markdown())
```
|                                 | Ｈｏｎｄａ ＦＣ   | ソニー仙台ＦＣ   | 東京武蔵野シティＦＣ   | テゲバジャーロ宮崎   | ホンダロックＳＣ   | ヴェルスパ大分   | ＦＣ大阪   | ＭＩＯびわこ滋賀   | ヴィアティン三重   | ＦＣマルヤス岡崎   | 鈴鹿ポイントゲッターズ   | ラインメール青森   | 奈良クラブ   | 松江シティＦＣ   | いわきＦＣ   | 高知ユナイテッドＳＣ   |
|:--------------------------------|:------------------|:-----------------|:-----------------------|:---------------------|:-------------------|:-----------------|:-----------|:-------------------|:-------------------|:-------------------|:-------------------------|:-------------------|:-------------|:-----------------|:-------------|:-----------------------|
| ('Ｈｏｎｄａ ＦＣ', 'H')        |                   |                  | 1△1                    |                      |                    |                  |            | 3○1                | 1△1                |                    |                          | 1○0                |              |                  |              |                        |
| ('Ｈｏｎｄａ ＦＣ', 'A')        |                   | 4○0              |                        |                      | 3○0                |                  | 1△1        |                    |                    |                    | 1○0                      |                    |              |                  |              |                        |
| ('ソニー仙台ＦＣ', 'H')         | 0●4               |                  |                        |                      |                    |                  |            |                    |                    |                    |                          |                    | 1△1          |                  |              | 3○1                    |
| ('ソニー仙台ＦＣ', 'A')         |                   |                  | 0●2                    |                      |                    | 4○2              |            |                    |                    | 2○1                |                          | 2○0                |              | 1●2              |              |                        |
| ('東京武蔵野シティＦＣ', 'H')   |                   | 2○0              |                        | 1●2                  |                    |                  | 2○1        |                    |                    |                    |                          |                    |              |                  |              |                        |
| ('東京武蔵野シティＦＣ', 'A')   | 1△1               |                  |                        |                      |                    |                  |            |                    |                    |                    | 0●1                      |                    |              |                  |              | 1△1                    |
| ('テゲバジャーロ宮崎', 'H')     |                   |                  |                        |                      | 1△1                |                  |            |                    |                    |                    |                          |                    | 1●2          | 2○0              |              |                        |
| ('テゲバジャーロ宮崎', 'A')     |                   |                  | 2○1                    |                      |                    |                  |            | 4○1                | 0△0                |                    | 1○0                      |                    |              |                  |              |                        |
| ('ホンダロックＳＣ', 'H')       | 0●3               |                  |                        |                      |                    | 1●2              | 0●4        |                    |                    |                    |                          |                    | 0●3          |                  |              |                        |
| ('ホンダロックＳＣ', 'A')       |                   |                  |                        | 1△1                  |                    |                  |            |                    |                    |                    |                          |                    |              | 3○1              | 2○1          | 1○0                    |
| ('ヴェルスパ大分', 'H')         |                   | 2●4              |                        |                      |                    |                  |            |                    |                    | 1○0                |                          | 1●2                |              |                  | 4○1          |                        |
| ('ヴェルスパ大分', 'A')         |                   |                  |                        |                      | 2○1                |                  |            |                    | 2○0                |                    |                          |                    | 2○1          |                  |              |                        |
| ('ＦＣ大阪', 'H')               | 1△1               |                  |                        |                      |                    |                  |            | 1○0                | 1●2                | 0△0                |                          |                    |              | 2○1              |              |                        |
| ('ＦＣ大阪', 'A')               |                   |                  | 1●2                    |                      | 4○0                |                  |            |                    |                    |                    |                          |                    |              |                  | 2●3          |                        |
| ('ＭＩＯびわこ滋賀', 'H')       |                   |                  |                        | 1●4                  |                    |                  |            |                    |                    |                    | 3△3                      | 6○0                |              | 1○0              |              |                        |
| ('ＭＩＯびわこ滋賀', 'A')       | 1●3               |                  |                        |                      |                    |                  | 0●1        |                    | 2○1                | 3○1                |                          |                    |              |                  |              |                        |
| ('ヴィアティン三重', 'H')       |                   |                  |                        | 0△0                  |                    | 0●2              |            | 1●2                |                    | 3○2                |                          |                    |              |                  |              |                        |
| ('ヴィアティン三重', 'A')       | 1△1               |                  |                        |                      |                    |                  | 2○1        |                    |                    |                    |                          |                    | 0●1          | 1●2              |              |                        |
| ('ＦＣマルヤス岡崎', 'H')       |                   | 1●2              |                        |                      |                    |                  |            | 1●3                |                    |                    |                          | 1△1                |              |                  | 0●2          |                        |
| ('ＦＣマルヤス岡崎', 'A')       |                   |                  |                        |                      |                    | 0●1              | 0△0        |                    | 2●3                |                    |                          |                    |              |                  |              | 2○0                    |
| ('鈴鹿ポイントゲッターズ', 'H') | 0●1               |                  | 1○0                    | 0●1                  |                    |                  |            |                    |                    |                    |                          |                    |              | 1●2              | 1○0          |                        |
| ('鈴鹿ポイントゲッターズ', 'A') |                   |                  |                        |                      |                    |                  |            | 3△3                |                    |                    |                          |                    | 1○0          |                  |              | 2△2                    |
| ('ラインメール青森', 'H')       |                   | 0●2              |                        |                      |                    |                  |            |                    |                    |                    |                          |                    |              | 3○0              | 1△1          |                        |
| ('ラインメール青森', 'A')       | 0●1               |                  |                        |                      |                    | 2○1              |            | 0●6                |                    | 1△1                |                          |                    |              |                  |              |                        |
| ('奈良クラブ', 'H')             |                   |                  |                        |                      |                    | 1●2              |            |                    | 1○0                |                    | 0●1                      |                    |              |                  |              | 1△1                    |
| ('奈良クラブ', 'A')             |                   | 1△1              |                        | 2○1                  | 3○0                |                  |            |                    |                    |                    |                          |                    |              |                  | 1●2          |                        |
| ('松江シティＦＣ', 'H')         |                   | 2○1              |                        |                      | 1●3                |                  |            |                    | 2○1                |                    |                          |                    |              |                  |              | 2○1                    |
| ('松江シティＦＣ', 'A')         |                   |                  |                        | 0●2                  |                    |                  | 1●2        | 0●1                |                    |                    | 2○1                      | 0●3                |              |                  |              |                        |
| ('いわきＦＣ', 'H')             |                   |                  |                        |                      | 1●2                |                  | 3○2        |                    |                    |                    |                          |                    | 2○1          |                  |              | 4○3                    |
| ('いわきＦＣ', 'A')             |                   |                  |                        |                      |                    | 1●4              |            |                    |                    | 2○0                | 0●1                      | 1△1                |              |                  |              |                        |
| ('高知ユナイテッドＳＣ', 'H')   |                   |                  | 1△1                    |                      | 0●1                |                  |            |                    |                    | 0●2                | 2△2                      |                    |              |                  |              |                        |
| ('高知ユナイテッドＳＣ', 'A')   |                   | 1●3              |                        |                      |                    |                  |            |                    |                    |                    |                          |                    | 1△1          | 1●2              | 3●4          |                        |