2016-11-29 5 views
5

Ich habe eine JSON-Datei, die mehrere Objekte, zB:Convert json Pandas 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} 

Ich versuche zu wandeln es in einem Pandas Datenrahmen mit dem folgenden Code: Jedoch

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) 

, gibt es mir 'NaN' für verschachtelte Werte, dh 'hilfreich' Attribut. Ich möchte die Ausgabe so, dass beide Schlüssel des verschachtelten Attributs eine separate Spalte sind.

EDIT:

P. S: Ich bin mit Try/außer, weil ich ‚\‘ Charakter in einigen Objekten, die mir einen JSON Dekodierungsfehler gibt.

Kann jemand helfen? Gibt es einen anderen Ansatz, den ich verwenden kann?

Vielen Dank.

+0

Haben Sie 'pandas.read_json' versucht? http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.html – DeepSpace

+0

@DeepSpace Ja, ich habe. Es gibt mir einen Fehler, der sagt, ValueError: 'schleppende Daten' –

+0

Nachgestellte Daten bedeutet, dass zusätzliche Daten in Ihrer Datei, die nicht Teil des Json-Objekts ist. Schauen Sie in Ihre Datei und stellen Sie sicher, dass es sich um einen gültigen JSON handelt. – RichSmith

Antwort

4

Verwenden json_normalize auf der Liste der Wörterbücher, die einigermaßen schneller auf große Anzahl von json Objekten durchführt.

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

Versuch:

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

enter image description here

+0

Das scheint zu funktionieren. Gibt es einen Weg, wie ich die oben erwähnte Lösung für die ersten 100 Objekte einfach machen und in einem separaten Datenrahmen speichern kann? Die Datei ist sehr groß und ich kann die oben erwähnte Lösung nicht ausführen, um die gesamte Datei auszuführen. Gibt es auch einen Weg, den ich ausprobieren kann? Weil ich ein '\' in einigen Objekten habe, das mir einen JsonDecodeError gibt –