2016-04-08 19 views
2

Ich habe die folgende JSON-Zeichenfolge in einer TXT-Datei und ich versuche, einen Datenrahmen aus der Variable 'VisualLogs' zu extrahieren. Ich kann die JSON-String in gelesen und ich kann die visualLogs Liste zugreifen, aber ich habe den ganzen Tag scheiterte lange diese in eine 9 Spalte Datenrahmen von Gleitkommazahlen zu konvertierenwie Python-Datenrahmen aus JSON-String extrahieren

{ 
    "visualScore" : 0, 
    "selfReportingResults" : 5, 
    "voiceScore" : "No Data", 
    "selfReportScore" : 0, 
    "subject" : "Baseline for patient: 108", 
    "email" : "[email protected]", 
    "visualLogs" : [ 
    "time,anger,contempt,disgust,engagement,joy,sadness,surprise,valence\r22.61086,0.00633,0.19347,0.56258,0.18005,0.00223,0.0165,0.31969,0.0\r22.81096,0.00478,0.19439,0.45847,0.09747,0.00188,0.02188,0.22043,0.0\r" 
    ], 
    "askedQuestions" : [ 
    "What is your name?", 
    "How old are you?", 
    "What tim is it?" 
    ], 
    "voiceCompleteResults" : { 
    "status" : "fail" 
    } 
} 

with open(f4lJasonFileName) as data_file: 
    feelDat = json.load(data_file) 

x = feelDat['visualLogs'][0] # Ultimately there will be more than one of these 

alle meine Versuche, zu konvertieren x ein Datenrahmen ist fehlgeschlagen. Ich habe es geschafft, einen 1-Spalten-Datenrahmen von Textwerten zu bekommen, aber das ist nicht was ich brauche.

Ich habe diese '\' Zeichen durch Kommas ersetzt, die am Ende den Datenrahmen der einen Spalte Text erhalten, aber ich will 9 Spalten mit den Bezeichnungen und dann Reihen der Fließpunkte.

+0

Haben Sie einen tatsächlichen 'pandas' Datenrahmen wollen, oder einfach nur eine 2-dimensionale Liste ? – Paul

+0

@Paul, nun, ich glaube, ich möchte einen Datenrahmen. R ist meine Muttersprache und ich bin es gewohnt mit Daten in Datenrahmen zu arbeiten. Mein derzeitiges Verständnis ist der Pandas-Datenrahmen und der R-Datenrahmen sind sehr ähnliche Strukturen. Ich werde an diesen Daten etwas modellieren. Ich benutze Python wegen seiner großartigen Unterstützung für Web-Entwicklung, da diese Daten durch eine API kommen. – svannoy

Antwort

1

Sobald Sie die json geladen haben, müssen Sie auf \ r aufzuspalten dann auf dem Komma:

import pandas as pd 

spl = d["visualLogs"][0].split("\r") 


df = pd.DataFrame([v for v in map(lambda x: x.split(","), spl[1:]) if v[0]], columns=spl[0].split(",")) 

Wahrscheinlich leichter in Teile gebrochen zu verstehen:

import pandas as pd 

# split into lines creating an iterator so we don't have to slice. 
spl = iter(d["visualLogs"][0].rstrip().split("\r")) 

# split first line to get the column names. 
columns = next(spl).split(",") 

# split remaining lines into individual rows, removing empty row. 
rows = [v for v in (sub_str.split(",") for sub_str in spl) if len(v) > 1] 

df = pd.DataFrame(data=rows, columns=columns) 

Wir können auch nur spl = iter(d["visualLogs"][0].split()) da es keine anderen Leerzeichen gibt.

Oder verwenden read_csv mit einem StringIO Objekt:

import pandas as pd 
spl = d["visualLogs"][0] 

from io import StringIO 
df = pd.read_csv(StringIO(spl)) 

Welche gibt Ihnen:

 time anger contempt disgust engagement  joy sadness \ 
0 22.61086 0.00633 0.19347 0.56258  0.18005 0.00223 0.01650 
1 22.81096 0.00478 0.19439 0.45847  0.09747 0.00188 0.02188 

    surprise valence 
0 0.31969  0 
1 0.22043  0 
+0

Gah, redigierte deine Antwort, während ich meine schrieb! 'pandas' scheint gut zu sein,' 'r' 'als Zeilentrenner zu verstehen, also keine Notwendigkeit zu teilen und wieder beitreten. – Paul

+0

@Paul, versuchte ich ohne aber gerade erst realisiert, dass ich bereits auf der \ r geteilt habe, als ich es tat, doh! –

+1

Vielleicht möchten Sie auch erwähnen, dass "StringIO" zwischen 2.x und 3.x verschoben wurde. Wenn Sie 'from io import StringIO' verwenden, sind Sie mit beiden kompatibel. 'from six.moves import StringIO' behandelt wahrscheinlich andere Fälle (nicht sicher, wann' io' zurückportiert wurde). – Paul