2016-03-14 86 views
2

我現在有一個JSON文件,該文件已經試過導入到Python 2.7版的幾種方法。Python 2.7版 - 解析奇怪的結構化JSON文件

這是我的數據:

[["195b95d248e5478485bfdff82ed7504a", {"attributes": {"checkin_payment_rate": {"N": "10"}, "dateBooked": {"S": "2015-11-03"}, "dateCheckin": {"S": "2015-11-03T15:41:40.126034+0000"}, "date_created": {"S": "2015-11-03T15:41:29.546868+0000"}, "spaceID": {"S": "67dcfcf3fafe4cde9e50069cdbff2314"}, "stripe_transferID": {"S": "tr_1736umJLCycAnsZaf52drYC0"}, "userID": {"S": "b0c096530f464c1fb2cba8ed5470bbc6"}}}], ["413b1dfe841c4f95b2169da369179cd1", {"attributes": {"checkin_payment_rate": {"N": "10"}, "dateBooked": {"S": "2015-09-11"}, "dateCheckin": {"S": "2015-09-11T20:22:40.218580+0000"}, "date_created": {"S": "2015-09-11T18:39:33.374925+0000"}, "spaceID": {"S": "8c85543487ba49dd816f9b1eceafd3ca"}, "stripe_transferID": {"S": "tr_16jy2eJLCycAnsZatj0aVWyB"}, "userID": {"S": "38522c00725245f58f58cca01a8b62c7"}}}], 

哪......你可以看到...只是一個大驢行。

這裏的代碼看起來什麼,當我運行一個簡單的負載命令和pprint等。

import json 
import pandas as pd 
from pandas.io.json import json_normalize 
from pprint import pprint 


with open('example.json') as json_data: 
    data = json.load(json_data) 


pprint(data) 

這是結果

[[u'195b95d248e5478485bfdff82ed7504a', 
    {u'attributes': {u'checkin_payment_rate': {u'N': u'10'}, 
       u'dateBooked': {u'S': u'2015-09-03'}, 
       u'dateCheckin': {u'S': u'2015-11-03T15:41:40.126034+0000'}, 
       u'date_created': {u'S': u'2015-11-03T15:41:29.546868+0000'}, 
       u'spaceID': {u'S': u'67dcfcf3fafe4cde9e50069cdbff2314'}, 
       u'stripe_transferID': {u'S': u'hr_9876umJLCycAnsZaf52drYC0'}, 
       u'userID': {u'S': u'c9df86530f464c1fb2cba8ed5470bbc6'}}}], 
[u'413b1dfe841c4f95b2169da369179cd1', 
    {u'attributes': {u'checkin_payment_rate': {u'N': u'10'}, 
       u'dateBooked': {u'S': u'2015-04-11'}, 
       u'dateCheckin': {u'S': u'2015-09-11T20:22:40.218580+0000'}, 
       u'date_created': {u'S': u'2015-09-11T18:39:33.374925+0000'}, 
       u'spaceID': {u'S': u'8c85543487ba49dd816f9b1eceafd3ca'}, 
       u'stripe_transferID': {u'S': u'gr_76jy2eJLCycAnsZatj0aVWyB'}, 
       u'userID': {u'S': u'36536c00725245f58f58cca01a8b62c7'}}}], 

我的目標是讓這個數據轉換成具有總體ID(列在第一種情況下,[[u'195b95d248e5478485bfdff82ed7504a」一個不錯的,有序的數據幀),對於同一行中的每個屬性都有單獨的列。

我已經試過

test1 = pd.read_json("example.json","records","frame") 

這給了我這樣的:

         0 \              
0  195b95d248e5478485bfdff82ed7504a 
1  413b1dfe841c4f95b2169da369179cd1 
                1 
0  {u'attributes': {u'stripe_transferID': {u'S': ... 
1  {u'attributes': {u'stripe_transferID': {u'S': ... 

這很好地證明,它給我的overaching IDS旁邊屬性的列的列..但是該ID的所有屬性都集中在第二列中。

我也嘗試下面的大熊貓正常化選項:

test2 = pd.io.json.json_normalize(data,'attributes',['stripe_transferID','dateCheckin','userID','spaceID','date_created','dateBooked','checkin_payment_rate','N'])

,但我不斷收到錯誤list indices must be integers, not str

我如何能既打破了第2列到test1的各列的任何想法或使測試2工作?感謝你們!

回答

1

不知道什麼是您的具體情況,但如果每一個元素的結構始終是相同的,你可以使用基本的Python對象,以實現精確的輸出你之後,在這種情況下,加載數據作爲一個字符串,我只是複製粘貼你的榜樣,固定支架,使它看起來像一個波普元素,在這種情況下,添加在最後「]」,使它看起來像一個列表,並使用AST使它的實際列表:

import ast 
import pandas as pd 

l = '''[["195b95d248e5478485bfdff82ed7504a", {"attributes":{"checkin_payment_rate": {"N": "10"}, 
    "dateBooked": {"S": "2015-11-03"}, "dateCheckin": {"S": "2015-11-03T15:41:40.126034+0000"}, 
    "date_created": {"S": "2015-11-03T15:41:29.546868+0000"}, "spaceID": {"S": "67dcfcf3fafe4cde9e50069cdbff2314"}, 
    "stripe_transferID": {"S": "tr_1736umJLCycAnsZaf52drYC0"}, "userID": {"S": "b0c096530f464c1fb2cba8ed5470bbc6"}}}], 
    ["413b1dfe841c4f95b2169da369179cd1", {"attributes": {"checkin_payment_rate": {"N": "10"}, 
    "dateBooked": {"S": "2015-09-11"}, "dateCheckin": {"S": "2015-09-11T20:22:40.218580+0000"}, 
    "date_created": {"S": "2015-09-11T18:39:33.374925+0000"}, "spaceID": {"S": "8c85543487ba49dd816f9b1eceafd3ca"}, "stripe_transferID": 
    {"S": "tr_16jy2eJLCycAnsZatj0aVWyB"}, "userID": {"S": "38522c00725245f58f58cca01a8b62c7"}}}]]''' 

data = ast.literal_eval(l) 

從這裏就是python,創建一個自定義函數:

def Parse(e): 
    dic = {k:v.values()[0] for (k,v) in e[1]['attributes'].items()}  #lose the S and N indicators 
    dic['id'] = e[0] #get the ID 
    return dic 

它應用到每一個元素:

pd.DataFrame([Parse(e) for e in data]) 

你應該得到這個(希望你要找的):

partial output

注意,列的順序是按字母順序排列,因爲它從字典來了。

+0

我的上帝太感謝你了澤爾這個完美的作品!我一直試圖找出現在的3天中更好的一部分。就好像這並不代表我對Python的新鮮感,難道我可能會麻煩你解釋你的自定義函數內部發生了什麼嗎?我很難理解你的魔法到底發生了什麼。非常感謝!! – manofone

+0

樂意提供幫助。要理解你主要知道'詞典理解'是什麼的功能,查閱它(這是列表對詞典的理解)。無論如何,該函數基本上對數據的任何元素(列表)都做了2件事,並將其包裝回一個簡單的鍵:value dict:1.將元素的第二部分作爲字典,其中每個值都是它是自己的字典,並且只保留內部字典的值,這是字典理解的目的,2.一旦你有一個很好的元素第二部分的簡單字典,你只需要添加它的第一部分的id的元素。 –