Python 如何将Pandascore E-Sports GET响应格式的JSON数据展平,以便在pandas中有一个非常干净的数据框架?
我正在尝试从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读取原始数据帧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调用,为
导入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'])