2017-04-21 615 views
1

我想在Python(Pandas)中使用json_normalize来扁化一个json文件,但作为一个noob在这我总是看起来最终在一个KeyError中。使用json_normalize来扁平化嵌套json

我想实现的是一个包含游戏中所有Plays的DataFrame。

我已经尝试了路径和前缀的众多变体,但没有成功。谷歌搜索很多,但我仍然不足。

我想直到结束就像一个数据框: 周期,时间,类型,PLAYER1,player2,xcord,ycord

import pandas as pd 
import json 

with open('PlayByPlay.json') as data_file:  
    data = json.load(data_file) 

from pandas.io.json import json_normalize 
records = json_normalize(data) 

plays = records['data.game.plays.play'][0] 
plays 

会产生

{'aoi': [8470324, 8473449, 8475158, 8475215, 8477499, 8477933], 
'apb': [], 
'as': 0, 
'asog': 0, 
'desc': 'Zack Kassian hit Kyle Okposo', 
'eventid': 7, 
'formalEventId': 'EDM7', 
'hoi': [8471678, 8475178, 8475660, 8476454, 8476457, 8476472], 
'hpb': [], 
'hs': 0, 
'hsog': 0, 
'localtime': '5:12 PM', 
'p1name': 'Zack Kassian', 
'p2name': 'Kyle Okposo', 
'p3name': '', 
'period': 1, 
'pid': 8475178, 
'pid1': 8475178, 
'pid2': 8473449, 
'pid3': '', 
'playername': 'Zack Kassian', 
'strength': 701, 
'sweater': '44', 
'teamid': 22, 
'time': '00:28', 
'type': 'Hit', 
'xcoord': 22, 
'ycoord': 38} 

的Json

 {'data': {'game': {'awayteamid': 7, 
    'awayteamname': 'Buffalo Sabres', 
    'awayteamnick': 'Sabres', 
    'hometeamid': 22, 
    'hometeamname': 'Edmonton Oilers', 
    'hometeamnick': 'Oilers', 
    'plays': {'play': [{'aoi': [8470324, 
     8473449, 
     8475158, 
     8475215, 
     8477499, 
     8477933], 
     'apb': [], 
     'as': 0, 
     'asog': 0, 
     'desc': 'Zack Kassian hit Kyle Okposo', 
     'eventid': 7, 
     'formalEventId': 'EDM7', 
     'hoi': [8471678, 8475178, 8475660, 8476454, 8476457, 8476472], 
     'hpb': [], 
     'hs': 0, 
     'hsog': 0, 
     'localtime': '5:12 PM', 
     'p1name': 'Zack Kassian', 
     'p2name': 'Kyle Okposo', 
     'p3name': '', 
     'period': 1, 
     'pid': 8475178, 
     'pid1': 8475178, 
     'pid2': 8473449, 
     'pid3': '', 
     'playername': 'Zack Kassian', 
     'strength': 701, 
     'sweater': '44', 
     'teamid': 22, 
     'time': '00:28', 
     'type': 'Hit', 
     'xcoord': 22, 
     'ycoord': 38}, 
    {'aoi': [8471742, 8475179, 8475215, 8475220, 8475235, 8475728], 
     'apb': [], 
     'as': 0, 
     'asog': 0, 
     'desc': 'Jesse Puljujarvi Tip-In saved by Robin Lehner', 
     'eventid': 59, 
     'formalEventId': 'EDM59', 
     'hoi': [8473468, 8474034, 8475660, 8477498, 8477934, 8479344], 
     'hpb': [], 
     'hs': 0, 
     'hsog': 1, 
     'localtime': '5:13 PM', 
     'p1name': 'Jesse Puljujarvi', 
     'p2name': 'Robin Lehner', 
     'p3name': '', 
     'period': 1, 
     'pid': 8479344, 
     'pid1': 8479344, 
     'pid2': 8475215, 
     'pid3': '', 
     'playername': 'Jesse Puljujarvi', 
     'strength': 701, 
     'sweater': '98', 
     'teamid': 22, 
     'time': '01:32', 
     'type': 'Shot', 
     'xcoord': 81, 
     'ycoord': 3}]}}, 
    'refreshInterval': 0}} 
+1

请出示您的代码和所需的输出。 – IanS

+1

...和一个有效的输入数据字典 –

回答

3

如果你只有一个游戏,这将创建你想要的数据框:

json_normalize(data['data']['game']['plays']['play']) 

然后你只需要提取列你感兴趣。

+0

如果有多个游戏,你需要更具体的关于你的目标。 – IanS

1

它可能是取消的直觉结构变得复杂使用这个API。 但关键是:json_normalize将JSON字段提取到表中。

我的情况:我有一个表

---------- 
| fact | // each row is a json object {'a':a, 'b':b....} 
---------- 

rrrrr = [] 
for index, row in data.iterrows(): 
    r1 = json_normalize(row['fact']) 
    rrrrr.append(r1) 
rr1 = pd.concat(rrrrr)