2017-04-21 34 views
1

私はPython(Pandas)でjson_normalizeを使用してjsonファイルを平坦化しようとしていますが、これはいつもKeyErrorで終わるようです。json_normalizeを使用してネストされたjsonを平坦化する

私が達成したいのは、ゲーム内のすべてのプレイを含むDataFrameです。

私はパスと接頭辞の数々の変種を試しましたが、成功しませんでした。グーグルも同様にグーグルではありますが、私はまだ不足しています。データフレームのようなものです私は何で終わるしたい

: 期間、時間、タイプ、player1、player2、xcordは、

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 

をycordは

{'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

...有効な入力データdict –

答えて

3

ゲームが1つしかない場合は、これで目的のデータフレームが作成されます。

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) 
関連する問題