2016-11-29 33 views
5

Tôi có một tập tin JSON trong đó có nhiều đối tượng như:Chuyển đổi json để gấu trúc DataFrame

{"reviewerID": "bc19970fff3383b2fe947cf9a3a5d7b13b6e57ef2cd53abc52bb2dfedf5fb1cd", "asin": "a6ed402934e3c1138111dce09256538afb04c566edf37c16b9ba099d23afb764", "overall": 2.0, "helpful": {"nHelpful": 1, "outOf": 1}, "reviewText": "This remote, for whatever reason, was chosen by Time Warner to replace their previous silver remote, the Time Warner Synergy V RC-U62CP-1.12S. The actual function of this CLIKR-5 is OK, but the ergonomic design sets back remotes by 20 years. The buttons are all the same, there's no separation of the number buttons, the volume and channel buttons are the same shape as the other buttons on the remote, and it all adds up to a crappy user experience. Why would TWC accept this as a replacement? I'm skipping this and paying double for a refurbished Synergy V.", "summary": "Ergonomic nightmare", "unixReviewTime": 1397433600} 

{"reviewerID": "3689286c8658f54a2ff7aa68ce589c81f6cae4c4d9de76fa0f66d5c114f79837", "asin": "8939d791e9dd035aa58da024ace69b20d651cea4adf6159d984872b44f663301", "overall": 4.0, "helpful": {"nHelpful": 21, "outOf": 22}, "reviewText": "This is a great truck GPS. I've tried others and nothing seems to come close to the Rand McNally TND-700.Excellent screen size and resolution. The audio is loud enough to be heard over road noise and the purr of my Kenworth/Cat engine. I've used it for the last 8,000 miles or so and it has only glitched once. Just restarted it and it picked up on my route right where it should have.Clean up the minor issues and this unit rates a solid 5.Rand McNally 528881469 7-inch Intelliroute TND 700 Truck GPS", "summary": "Great Unit!", "unixReviewTime": 1280016000} 

Tôi cố gắng để chuyển nó sang một Pandas DataFrame sử dụng đoạn mã sau:

train_df = pd.DataFrame() 
count = 0; 
for l in open('train.json'): 
    try: 
     count +=1 
     if(count==20001): 
      break 
     obj1 = json.loads(l) 
     df1=pd.DataFrame(obj1, index=[0]) 
     train_df = train_df.append(df1, ignore_index=True) 
    except ValueError: 
     line = line.replace('\\','') 
     obj = json.loads(line) 
     df1=pd.DataFrame(obj, index=[0]) 
     train_df = train_df.append(df1, ignore_index=True) 

Tuy nhiên , nó mang lại cho tôi 'NaN' cho các giá trị lồng nhau tức là thuộc tính 'hữu ích'. Tôi muốn đầu ra sao cho cả hai khóa của thuộc tính lồng nhau là một cột riêng biệt.

EDIT:

Tái bút: Tôi đang sử dụng thử/trừ bởi vì tôi có '\' nhân vật trong một số đối tượng mà mang lại cho tôi một lỗi JSON giải mã.

Có ai giúp được không? Có cách tiếp cận nào khác mà tôi có thể sử dụng không?

Cảm ơn bạn.

+0

Các bạn đã thử 'pandas.read_json'? http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.html – DeepSpace

+0

@DeepSpace Có, tôi có. Nó cho tôi lỗi khi nói ValueError: 'trailing data' –

+0

Trailing data có nghĩa là có thêm dữ liệu trong tập tin của bạn mà không phải là một phần của đối tượng json. Có một cái nhìn trong tập tin của bạn và chắc chắn rằng nó là tất cả các json hợp lệ. – RichSmith

Trả lời

4

Sử dụng json_normalize thuộc danh mục các từ điển mà thực hiện một cách hợp lý nhanh hơn trên số lượng lớn của các đối tượng json.

from pandas.io.json import json_normalize 

my_list = [] 
with open('train.json') as f: 
    for line in f: 
     line = line.replace('\\','') 
     my_list.append(json.loads(line)) 

# avoid transposing if you want to keep keys as columns of the dataframe 
result_df = json_normalize(my_list).T 

enter image description here

0

thử:

pd.concat([pd.Series(json.loads(line)) for line in open('train.json')], axis=1) 

enter image description here

+0

Điều này dường như hoạt động. Có cách nào mà tôi chỉ có thể làm các giải pháp được đề cập ở trên cho 100 đối tượng đầu tiên và lưu trữ chúng trong một khung dữ liệu riêng biệt? Tệp này rất lớn và tôi không thể chạy giải pháp được đề cập ở trên để chạy trên toàn bộ tệp. Ngoài ra, có cách nào tôi có thể sử dụng thử/ngoại trừ với điều này? Bởi vì tôi có một '\' trong một số đối tượng mang lại cho tôi một JsonDecodeError –

Các vấn đề liên quan