Python 如何将Pandascore E-Sports GET响应格式的JSON数据展平,以便在pandas中有一个非常干净的数据框架?

Python 如何将Pandascore E-Sports GET响应格式的JSON数据展平,以便在pandas中有一个非常干净的数据框架?,python,json,bash,pandas,curl,Python,Json,Bash,Pandas,Curl,我正在尝试从PandaScore REST API获取一个JSON文件的数据帧。我意识到,为了做到这一点,我需要将包含列表和字典的值展平,但是我得到了错误 由于这个原因,我不知道该如何进行。至于我从pandas中直接读取JSON文件得到的数据帧,我得到了这个。 正如您从输出中看到的,列包含JSON对象的列表,因此我希望将这些列表和对象展平,以便最终的数据帧看起来更加清晰和可解释 如果原始JSON文件有助于实现这一点,您可以从这里获得它。 我首先使用curl对PandaScore进行API调用,为

我正在尝试从PandaScore REST API获取一个JSON文件的数据帧。我意识到,为了做到这一点,我需要将包含列表和字典的值展平,但是我得到了错误

由于这个原因,我不知道该如何进行。至于我从pandas中直接读取JSON文件得到的数据帧,我得到了这个。 正如您从输出中看到的,列包含JSON对象的列表,因此我希望将这些列表和对象展平,以便最终的数据帧看起来更加清晰和可解释

如果原始JSON文件有助于实现这一点,您可以从这里获得它。 我首先使用curl对PandaScore进行API调用,为反击全球进攻团队的第一页获取JSON对象数组。JSON响应如下所示

我对使用curl还很陌生,所以我不确定如何立即将此响应保存到文件中,所以我只是复制了响应并将其放入JSON文件中。这样做之后,;但是,格式不是我想象的那样,所以我最终在终端中使用jq将文件中的响应内容管道化为格式良好的JSON

这样做之后,我得到了一个JSON文件,现在看起来像这样:

我意识到要在pandas中展平JSON文件,可以使用pandas的normalizejson函数,但我不确定如何让它工作。为了获得字典形式,我尝试使用Python中的JSON模块来获取字典,然后将字典传递给函数,但没有成功。我还尝试使用以下命令从pandas读取原始数据帧

导入json
#实验1
data=str(打开(“data/cs go teams.json”))
dataDict=json.load(数据)
作为pd进口熊猫
从pandas.io.json导入规范化_json
#实验2
data=pd.read_json(“cs go teams.json”)
dataDict=data.to_dict()
normalizedata=normalize_json(dataDict)
错误1: 错误2:

我的直觉是,文件的JSON格式有问题,导致了这个问题

如果是别的,我很乐意从您的专业知识和经验中学习,作为一名使用JSON数据的开发人员成长

除了这两个实验之外,我还研究了如何对结构更复杂的JSON对象进行进一步的扁平化。Amir Ziai撰写的一篇关于Medium的文章提供了一个自定义函数,可以递归地展平嵌套在对象中的列表和字典。如果这可能有任何帮助,我提供的文章作为一个链接到您的方便


到目前为止我只做了这些。社会各界,,我正在积极寻求您的帮助,以找出我在理解从数据收集到JSON格式到扁平化工作的整个过程中的不足之处。

这可能是
errors='ignore'
函数的
JSON\u normalize
参数所克服的错误之一——检查文档。但这仅适用于
pandas
version>=0.20,因此请检查您的版本(
pd.\uuuuuuu version\uuuuu


打开文件,将其加载到df中,然后调查球员数据,然后将团队数据附加到每个球员。您只需更改open()语句中的文件路径。

感谢您提供JSON示例。下面的代码将其转换为pandas
DataFrame
。这不需要使用
import json
函数

# Import Libraries
import numpy as np
import pandas as pd

# Set null equal to None
null = None
将json分配给变量

请注意,它是一个包含多个词典的列表

data = data = [
  {
    "slug": "infinity-esports-cs-go",
    "players": [
      {
        "slug": "cruzn",
        "role": null,
        "name": "CruzN",
        "last_na
...
]
下面的代码解析json和嵌套json以放入数据帧中

可以根据需要重命名这些列

# Create empty lists
list_slug, list_players, list_name, list_image_url, list_id, list_current_videogame, list_acronym = [], [], [], [], [], [], []
df = pd.DataFrame()
for i in range (len(data)):
    list_slug.append(data[i]['slug'])
    list_players.append(data[i]['players'])
    list_name.append(data[i]['name'])
    list_image_url.append(data[i]['image_url'])
    list_current_videogame.append(data[i]['current_videogame'])
    list_acronym.append(data[i]['acronym'])
    list_id.append(data[i]['id'])
    #temp['players'] = data[i]['players']
    #print(data[i]['slug'])


    # Create dataframe for 'current_videogame'
    tvid = pd.DataFrame({'current_videogame_slug':[data[i]['current_videogame']['slug']],
                     'current_videogame_name':[data[i]['current_videogame']['name']],
                     'current_videogame_id':[data[i]['current_videogame']['id']]
                    })
    tvid['flag']=data[i]['slug']

    # Create dataframe for 'players'
    tplayer = pd.DataFrame(data[i]['players'])
    tplayer.columns = ['players_' + str(col) for col in tplayer.columns]
    tplayer['flag'] = data[i]['slug']

    # Merge 'current_videogame' and 'players'
    tjoin = pd.merge(tplayer, tvid, on='flag', how='outer')

    # Merge with main dataframe
    temp = pd.DataFrame({'slug':list_slug, 'name':list_name, 'image_url':list_image_url,'acronym': list_acronym, 'id':id})
    temp2 = pd.merge(temp, tjoin, left_on='slug', right_on='flag', how='outer')

    df = df.append(temp2)
    df = df.drop(columns=['flag'])
输出:


本,这太美了!非常感谢您提供了这段很棒且简单的代码!谢谢你,尼利斯。这看起来是一个相当大的工作,但我非常感谢你花时间来制定这个解决方案。我确实从你的解决方案中学到了很多。:)
# Create empty lists
list_slug, list_players, list_name, list_image_url, list_id, list_current_videogame, list_acronym = [], [], [], [], [], [], []
df = pd.DataFrame()
for i in range (len(data)):
    list_slug.append(data[i]['slug'])
    list_players.append(data[i]['players'])
    list_name.append(data[i]['name'])
    list_image_url.append(data[i]['image_url'])
    list_current_videogame.append(data[i]['current_videogame'])
    list_acronym.append(data[i]['acronym'])
    list_id.append(data[i]['id'])
    #temp['players'] = data[i]['players']
    #print(data[i]['slug'])


    # Create dataframe for 'current_videogame'
    tvid = pd.DataFrame({'current_videogame_slug':[data[i]['current_videogame']['slug']],
                     'current_videogame_name':[data[i]['current_videogame']['name']],
                     'current_videogame_id':[data[i]['current_videogame']['id']]
                    })
    tvid['flag']=data[i]['slug']

    # Create dataframe for 'players'
    tplayer = pd.DataFrame(data[i]['players'])
    tplayer.columns = ['players_' + str(col) for col in tplayer.columns]
    tplayer['flag'] = data[i]['slug']

    # Merge 'current_videogame' and 'players'
    tjoin = pd.merge(tplayer, tvid, on='flag', how='outer')

    # Merge with main dataframe
    temp = pd.DataFrame({'slug':list_slug, 'name':list_name, 'image_url':list_image_url,'acronym': list_acronym, 'id':id})
    temp2 = pd.merge(temp, tjoin, left_on='slug', right_on='flag', how='outer')

    df = df.append(temp2)
    df = df.drop(columns=['flag'])