2016-04-08 10 views
2

gelen piton veri çerçevesini ayıklamak için. Ben de JSON dizesi okumayı ve visualLogs listesine erişebilir, ama kayan nokta sayılarınasıl bir txt dosyasında aşağıdaki JSON dizesi var ve 'visualLogs' değişkeni bir veri çerçevesi ayıklamak çalışıyorum JSON dize

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

için x dönüştürmek için benim çabaların tamamı bir 9 sütun veri çerçevesi içine bu dönüştürmek için gün boyu başarısız olmuş bir veri çerçevesi başarısız oldu. Metin değerlerinin 1 sütun veri çerçevesini almayı başardım, ancak ihtiyacım olan şey bu değil.

Ben bir sütun metin veri çerçevesini elde biter virgül, sahip olanlar '\ r' karakteri değiştirilir, ama ben o zaman etiket ve yüzer noktalarının satır ile 9 sütun istiyorum. Eğer json yükledikten sonra

+0

Eğer gerçek bir 'pandas' dataframe, ya da sadece 2 boyutlu listesini istiyor musunuz ? – Paul

+0

@Paul, bir veri çerçevesi istiyorum galiba. R benim ana dilidir ve veri çerçevelerinde veri ile çalışıyorum. Benim şimdiki anlayışım pandalar veri çerçevesi ve R veri çerçevesi çok benzer yapılardır. Bu verilere biraz modelleme yapacağım. Bu veri bir API – svannoy

cevap

1

, virgülle daha sonra \ r bölmek gerekir:

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(",")) 
Muhtemelen

kolay parçaya ayrılmış, anlamak için:

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) 

Biz sadece spl = iter(d["visualLogs"][0].split()) de olabilir başka bir boşluk olmadığı için.

Veya StringIO nesnesi kullanılarak read_csv kullanın:

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

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

verir:

 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 aracılığıyla geliyor gibi web geliştirme için harika bir destek nedeniyle python kullanıyorum, benim yazarken cevabınızı düzenledi! "pandalar" bir çizgi ayırıcı olarak anlaşılmasında iyi görünüyor, böylelikle bölme ve yeniden katılmaya gerek yok. – Paul

+0

@Paul, Ben denedim ama farkettim ki, yaptığım zaman çoktan ayrıldım, doh! –

+1

Ayrıca, 'StringIO'nun 2.x ile 3.x arasında değiştiğini de belirtmek istersiniz. Eğer io import StringIO'dan kullanırsanız, her ikisiyle de uyumlu olacaksınız. 'six.moves import StringIO'dan muhtemelen diğer durumları ele alır (io’nun geri döndüğünden emin değil). – Paul

İlgili konular