新たに作成
- crosstabに変更
- lambdaに変更
import pandas as pd import numpy as np # 行数 pd.set_option("display.max_columns", None) # データ取得 # 試合結果を取得 url = "http://www.jfl.or.jp/jfl-pc/view/s.php?a=1411&f=2019A001_spc.html" dfs = pd.read_html(url, na_values="-") # 前処理 # 列名変更 for i in range(len(dfs)): dfs[i].columns = ["日にち", "時間", "ホーム", "スコア", "アウェイ", "スタジアム", "備考"] ## 結合 # 結合、節を追加 df = pd.concat(dfs, keys=[i for i in range(1, len(dfs) + 1)], names=["節", "番号"]) # 備考削除 df.drop("備考", axis=1, inplace=True) # 内容確認 df.head() ## 欠損削除 # 欠損値確認 df[df.isnull().any(axis=1)] # スコアがないものを除去 df.dropna(subset=["スコア"], inplace=True) ## スコア分割 # スコアを分割、スコアを削除、結合 df1 = pd.concat([df, df["スコア"].str.split("-", expand=True)], axis=1).drop("スコア", axis=1) # 名前をホーム得点、アウェイ得点に変更 df1.rename(columns={0: "ホーム得点", 1: "アウェイ得点"}, inplace=True) # ホーム得点、アウェイ得点を文字から整数に変更 df1["ホーム得点"] = df1["ホーム得点"].astype(int) df1["アウェイ得点"] = df1["アウェイ得点"].astype(int) df1.dtypes # データ確認 df1.head() ## ホーム・アウェイ別集計 # ホームの結果のみ df_home = df1.loc[:, ["ホーム", "ホーム得点", "アウェイ得点"]] df_home.columns = ["チーム名", "得点", "失点"] df_home["戦"] = "ホーム" df_home.head() # アウェイの結果のみ df_away = df1.loc[:, ["アウェイ", "アウェイ得点", "ホーム得点"]] df_away.columns = ["チーム名", "得点", "失点"] df_away["戦"] = "アウェイ" df_away.head() # ホームとアウェイを結合 df_total = pd.concat([df_home, df_away]) ## 得失点計算 # 得失点を計算 df_total["得失点"] = df_total["得点"] - df_total["失点"] ## 勝敗・勝点追加 # 勝敗追加 df_total["勝敗"] = df_total["得失点"].apply(lambda x: "引分" if x == 0 else "敗戦" if x < 0 else "勝利") # 勝点追加 df_total["勝点"] = df_total["得失点"].apply(lambda x: 1 if x == 0 else 0 if x < 0 else 3) df_total.head() # 集計 ## 得失点・勝敗・勝点集計 # 得点・失点・得失点・勝点 集計 pv_score = df_total.pivot_table(values=["得点", "失点", "得失点", "勝点"], index="チーム名", aggfunc=sum) pv_score ## 勝敗カウント # 勝敗集計 pv_wl = pd.crosstab(df_total["チーム名"], [df_total["戦"], df_total["勝敗"]]) # 列名変更 pv_wl.columns = ["勝利A", "引分A", "敗戦A", "勝利H", "引分H", "敗戦H"] # 合計追加 pv_wl["勝利"] = pv_wl["勝利H"] + pv_wl["勝利A"] pv_wl["引分"] = pv_wl["引分H"] + pv_wl["引分A"] pv_wl["敗戦"] = pv_wl["敗戦H"] + pv_wl["敗戦A"] # 試合数追加 pv_wl["試合数"] = pv_wl["勝利"] + pv_wl["引分"] + pv_wl["敗戦"] # 確認 pv_wl ## 評価値 df2 = df_total.copy() # 評価値を作成 df2["評価値"] = ((df2["勝点"]) * 10000) + (df2["得失点"] * 100) + df2["得点"] df2 # 評価値集計 df3 = df2.pivot_table(values="評価値", index="チーム名", columns="節", aggfunc=sum, fill_value=0) df3 # 評価値の累計和 df_eval = df3.apply(lambda d: d.cumsum(), axis=1) df_eval ## 順位 # 評価値から順位作成 df_chart = df_eval.rank(ascending=False, method="min").astype(int) df_chart.sort_values(by=df_chart.columns[-1], inplace=True) df_chart # 最終順位取得 s1 = df_chart.iloc[:, -1] s1.name = "順位" ## 順位差分 df_diff = df_chart.diff(axis=1).fillna(0).astype(int) df_diff # 前節差分 s2 = df_diff.iloc[:, -1].apply(lambda x: "-" if x == 0 else "▼" if x < 0 else "▲") s2.name = "前節" s2 # ランキング作成 # 全部を結合 df4 = pd.concat([pv_score, pv_wl], axis=1).join([s1, s2]) # 順位で昇順 df4.sort_values(["順位"], inplace=True) df4 # ランキング完成 df_rank = df4.reset_index().loc[:, ["前節", "順位", "チーム名", "勝点", "試合数", "勝利", "勝利H", "勝利A", "引分", "引分H", "引分A", "敗戦", "敗戦H", "敗戦A", "得失点", "得点", "失点"]] df_rank