2016-04-25 15 views
7

Ho un file Json come segue. È una lista di dict.Lettura file Json come errore Pandas Dataframe

[{"city": "ab", "trips": 4, "date": "2014-01-25", "value": 4.7, "price": 1.1, "request_date": "2014-06-17", "medium": "iPhone", "%price": 15.4, "type": true, "Weekly_pct": 46.2, "avg_dist": 3.67, "avg_price": 5.0}, {"city": "bc", "trips": 0, "date": "2014-01-29", "value": 5.0, "price": 1.0, "request_date": "2014-05-05", "medium": "Android", "%price": 0.0, "type": false, "weekly_pct": 50.0, "avg_dist": 8.26, "avg_price": 5.0}.....] 

Quando ho letto questo usando questo:

data=pd.read_json('dataset.json') 

ottengo il seguente errore:

ValueError: Expected object or value

Ho provato anche questo:

from ast import literal_eval 

with open('dataset.json') as f: 
    data = literal_eval(f.read()) 

df = pd.DataFrame(data) 

E ha pronunciato la seguente errore:

ValueError: malformed string

Edit:

Anche Json.loads non funziona. Abbiamo provato questo:

import json 
data=json.loads('dataset.json') 

ValueError: No JSON object could be decoded

Il file JSON è 13.5MB, ma sembra avere enormi quantità di dati.

+0

'json.loads' funziona? ('importazione json' prima ...) – IanS

+0

No. Ho provato che mi ha dato questo errore. Controlla Modifica. – Baktaawar

+0

Penso che potresti trarre vantaggio da questa risposta: http://stackoverflow.com/a/20644150/5276797 – IanS

risposta

7

Penso che si possa utilizzare Modulo json per la lettura file.json e poi DataFrame constructor:

import pandas as pd 
import json 

with open('file.json') as f: 
    data = json.load(f) 
print data 
[{u'city': u'ab', u'medium': u'iPhone', u'request_date': u'2014-06-17', u'price': 1.1, u'Weekly_pct': 46.2, u'value': 4.7, u'%price': 15.4, u'avg_price': 5.0, u'date': u'2014-01-25', u'avg_dist': 3.67, u'type': True, u'trips': 4}, {u'city': u'bc', u'medium': u'Android', u'request_date': u'2014-05-05', u'price': 1.0, u'weekly_pct': 50.0, u'value': 5.0, u'%price': 0.0, u'avg_price': 5.0, u'date': u'2014-01-29', u'avg_dist': 8.26, u'type': False, u'trips': 0}] 

print pd.DataFrame(data) 

    %price Weekly_pct avg_dist avg_price city  date medium price \ 
0 15.4  46.2  3.67  5.0 ab 2014-01-25 iPhone 1.1 
1  0.0   NaN  8.26  5.0 bc 2014-01-29 Android 1.0 

    request_date trips type value weekly_pct 
0 2014-06-17  4 True 4.7   NaN 
1 2014-05-05  0 False 5.0  50.0 
+1

Penso che l'esempio OP abbia funzionato e che l'errore sia sepolto da qualche parte nel file di grandi dimensioni ... – IanS

+1

Hmmm, I ottieni il primo errore ('ValueError: Expected object or value') e il secondo errore (' ValueError: malformed string') anche con sample. Ma la mia soluzione funziona molto bene. – jezrael

+0

ok. Ho appena fatto ciò che @jezrael ha suggerito. E ha funzionato. Tuttavia il mio ordine di colonne è diverso. Come la città dovrebbe essere la prima colonna, ma sta arrivando in un ordine diverso mentre si sta facendo troppo. Qualche idea su come ottenere lo stesso ordine dei nomi delle colonne? – Baktaawar

0

È necessario indicare al panda che "record" di formattazione (dove il JSON appare come un elenco di dizionari) è utilizzato in datasets.json.

res = pd.read_json('input/dataset.json', orient='records') 

print(res.iloc[:, :5]) 
    %price Weekly_pct avg_dist avg_price city 
0 15.4  46.2  3.67   5 ab 
1  0.0   NaN  8.26   5 bc 
+0

@IanS Questo può rispondere alla tua domanda sul perché 'read_json' fallisce da solo qui –