Python 如何从json数据创建数据帧-数组中的dicts、list和array
我无法从json数据中获取数据,只能获取标题 我曾尝试使用json_normalize,它从json数据创建一个数据帧,但当我尝试循环并附加数据时,结果是我只得到了头Python 如何从json数据创建数据帧-数组中的dicts、list和array,python,arrays,json,numpy,dataframe,Python,Arrays,Json,Numpy,Dataframe,我无法从json数据中获取数据,只能获取标题 我曾尝试使用json_normalize,它从json数据创建一个数据帧,但当我尝试循环并附加数据时,结果是我只得到了头 将熊猫作为pd导入 导入json 导入请求 从pandas.io.json导入json_规范化 将numpy作为np导入 #导入json数据 def get_json(文件路径): r=请求。获取('https://www.atg.se/services/racinginfo/v1/api/games/V75_2019-09-29
将熊猫作为pd导入
导入json
导入请求
从pandas.io.json导入json_规范化
将numpy作为np导入
#导入json数据
def get_json(文件路径):
r=请求。获取('https://www.atg.se/services/racinginfo/v1/api/games/V75_2019-09-29_5_6')
jsonResponse=r.json()
打开(文件路径为“w”,编码为“utf-8”)作为输出文件:
dump(jsonResponse,outfile,确保ascii=False,indent=None)
#运行函数并选择保存json文件的位置
获取_json('../trav.json')
#打开json文件并打印密钥列表
使用open('../trav.json',r')作为json_数据:
d=json.load(json_数据)
打印(列表(d.keys()))
[Out]:
['@type','id','status','pool','races','currentVersion']
为了在一场比赛中获得起跑的所有数据,我可以使用json_normalize函数
race\u 1\u starts=json\u规范化(d['races'][0]['starts']
比赛1开始比赛df=比赛1开始。下降(“视频”,轴=1)
打印(比赛\u 1\u开始\u df)
[Out]:
距离驱动程序。出生。。。result.prizeMoney result.startNumber
0 1640 1984 ... 62500 1
1 1640 1976 ... 11000 2
2 1640 1968 ... 500 3
3 1640 1953 ... 250000 4
4 1640 1968 ... 500 5
5 1640 1962 ... 18500 6
6 1640 1961 ... 7000 7
7 1640 1989 ... 31500 8
8 1640 1960 ... 500 9
9 1640 1954 ... 500 10
10 1640 1977 ... 125000 11
11 1640 1977 ... 500 12
在上面,我们得到了一个数据帧,其中包含一场比赛的所有起跑数据。但是,当我尝试循环范围内的所有比赛以获取所有比赛的所有起跑数据时,我只获取每场比赛的标题,而不获取每场比赛的起跑数据:
所有_开始=[]
对于范围内的t(len(d['races']):
附加([t+1,json_规范化(d['races'][t]['starts']))
all_starts_df=pd.DataFrame(all_starts,columns=['race','starts']))
打印(所有开始位置)
[Out]:
比赛开始
0 1距离。。。
12距离。。。
2 3距离。。。
3.4距离。。。
4.5距离。。。
5.6距离。。。
6.7距离。。。
在输出中,我想要一个数据帧,它是来自所有种族的所有起点上的数据的合并。请注意,列的数量可能因种族而异,但我希望在一个种族有21列,另一个种族有20列的情况下,all_starts_df应该包含所有列,但如果一个种族没有一列的数据,它应该说“NaN”
预期结果:
[Out]:
赛跑距离车手。出生。。。result.column_20 result.column_22
1 1640 1984 ... 12500 1
1 1640 1976 ... 11000 2
2 2140 1968 ... 南1
2 2140 1953 ... 南2
3 3360 1968 ... 1500南
3 3360 1953 ... 250000南
如果需要所有列,可以尝试此操作。。(我发现有20多列,所以可能有问题。)
或者,如果您知道要保留的列的名称,请尝试以下操作
columns = ['race', 'distance', 'driver.birth', 'result.prizeMoney']
all_starts = []
for idx, race in enumerate(d['races']):
df = json_normalize(race['starts'])
df['race'] = idx
all_starts.append(df[columns])
# Concatenate all dataframes for each race to make one dataframe
df_all_starts = pd.concat(all_starts, axis=0)
如果您想要所有列,可以尝试此。。(我发现有20多列,所以可能有问题。) 或者,如果您知道要保留的列的名称,请尝试以下操作
columns = ['race', 'distance', 'driver.birth', 'result.prizeMoney']
all_starts = []
for idx, race in enumerate(d['races']):
df = json_normalize(race['starts'])
df['race'] = idx
all_starts.append(df[columns])
# Concatenate all dataframes for each race to make one dataframe
df_all_starts = pd.concat(all_starts, axis=0)
超级的!非常感谢您的快速回复!:)超级的!非常感谢您的快速回复!:)