Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从json数据创建数据帧-数组中的dicts、list和array_Python_Arrays_Json_Numpy_Dataframe - Fatal编程技术网

Python 如何从json数据创建数据帧-数组中的dicts、list和array

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

我无法从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_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)

超级的!非常感谢您的快速回复!:)超级的!非常感谢您的快速回复!:)