首页 > 解决方案 > 重构数据框(存储在字典中)

问题描述

我将不同赛季的足球数据按联赛存储在字典中。因此,例如,我将 2017-2020 赛季的 1 个联赛的结果存储在字典中的一个数据框中。现在我需要按季节创建新的数据框,以便将 2019 年的所有结果都放在一个数据框中。做这个的最好方式是什么?

谢谢!

标签: pandasdictionary

解决方案


  • 假设您使用开放式足球作为来源
  • 使用 GitHub API 获取 repo 中的所有文件
  • 规范化 JSON 的函数
  • 很容易生成所有结果的字典的连接 DF
import requests
import pandas as pd

# normalize footbal scores data into a dataframe
def structuredf(res):
    js = res.json()

    if "rounds" not in res.json().keys():
        return (pd.json_normalize(js["matches"])
                .pipe(lambda d: d.loc[:,].join(d["score.ft"].apply(pd.Series).rename(columns={0:"home",1:"away"})))
                .drop(columns="score.ft")
                .rename(columns={"round":"name"})
                .assign(seasonname=js["name"], url=res.url)
               )
    df = (pd.json_normalize(pd.json_normalize(js["rounds"])
                            .explode("matches").to_dict("records"))
          .assign(seasonname=js["name"], url=res.url)
          .pipe(lambda d: d.loc[:,].join(d["matches.score.ft"].apply(pd.Series).rename(columns={0:"home",1:"away"})))
          .drop(columns="matches.score.ft")
          .pipe(lambda d: d.rename(columns={c:c.split(".")[-1] for c in d.columns}))
         )
    return df

# get listing of all datafiles that we're interested in
res = requests.get("https://api.github.com/repos/openfootball/football.json/git/trees/master?recursive=1")
dfm = pd.DataFrame(res.json()["tree"])

# concat into one dataframe
df = pd.concat([structuredf(res) 
                for p in dfm.loc[dfm["path"].str.contains(r".en.[0-9]+.json"), "path"].iteritems()
               for res in [requests.get(f"https://raw.githubusercontent.com/openfootball/football.json/master/{p[1]}")]])

# dictionary of dataframe
d = {res.json()["name"]:structuredf(res) 
                for p in dfm.loc[dfm["path"].str.contains(r".en.[0-9]+.json"), "path"].iteritems()
               for res in [requests.get(f"https://raw.githubusercontent.com/openfootball/football.json/master/{p[1]}")]}



推荐阅读