2017-04-21 121 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)