pandas - 重构数据框(存储在字典中)
问题描述
我将不同赛季的足球数据按联赛存储在字典中。因此,例如,我将 2017-2020 赛季的 1 个联赛的结果存储在字典中的一个数据框中。现在我需要按季节创建新的数据框,以便将 2019 年的所有结果都放在一个数据框中。做这个的最好方式是什么?
谢谢!
解决方案
- 假设您使用开放式足球作为来源
- 使用 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]}")]}
推荐阅读
- html - 不使用 css 创建复杂的表结构
- c++ - `inline`、`constexpr` 或 `noexcept` 仅用于声明函数
- java - 如何利用 Java 多线程实现最大速度和最小错误?
- java - 如何从内部存储中读取文件
- database - 如何使用 awk 处理 ASCII 不可打印字符
- javascript - php变量通过javascript获取后如何转换为float?Php 的 (float) 转换函数返回 0 并且不转换
- c# - 从 JSON 中创建动态对象,忽略空字段
- python - 将列表拆分为批次以处理每个批次中的元素多线程
- sed - 如何用多行格式的多行替换一行?
- azure-data-factory - 通过 Azure 数据工厂加载 JSON 文件