2015-07-29 10 views
6

Ich habe eine Reihe von URLs mit JSON-Dateien und einem leeren Pandas-Datenframe mit Spalten, die die Attribute der JSNON-Dateien darstellen. Nicht alle JSON-Dateien haben alle Attribute im Pandas-Datenrahmen. Was ich tun muss, ist Wörterbücher aus den JSON-Dateien zu erstellen und dann jedes Wörterbuch als neue Zeile an den Pandas-Datenrahmen anzuhängen, und falls die JSON-Datei kein Attribut hat, das einer Spalte im Datenrahmen entspricht, muss dies sein gefüllt leer.Wie hängt man ein Wörterbuch an einen Pandas-Datenrahmen an?

habe ich es geschafft Wörterbücher zu erstellen, wie:

import urllib2 
import json 

url = "https://cws01.worldstores.co.uk/api/product.php?product_sku=ULST:7BIS01CF" 
data = urllib2.urlopen(url).read() 
data = json.loads(data) 

und dann habe ich versucht, für Schleife zu erzeugen, wie folgt:

row = -1 
for i in links: 
    row = row + 1 
    data = urllib2.urlopen(str(i)).read() 
    data = json.loads(data) 
    for key in data.keys(): 
     for column in df.columns: 
      if str(column) == str(key): 
       df.loc[[str(column)],row] = data[str(key)] 
      else: 
       df.loc[[str(column)],row] = None 

wo df die Datenrahmen und Links ist

der Satz von Urls ist

Ich erhalte jedoch den folgenden Fehler:

raise KeyError('%s not in index' % objarr[mask]) 

KeyError: "['2_seater_depth_mm'] not in index" 

wo [ '2_seater_depth_mm']

Antwort

4

Für mich unter Code die erste Spalte der Pandas Datenrahmen ist funktioniert:

row = -1 
for i in links: 
    row = row + 1 
    data = urllib2.urlopen(str(i)).read() 
    data = json.loads(data) 
    for key in data.keys(): 
     df.loc[row,key] = data[key] 

Sie haben Reihenfolge der Argumente in .loc() gemischt und haben eine zu viel []

+0

es gibt mir diese Fehlermeldung: other = np.array (andere, dtype = 'i8') Valueerror: invalid für lange wörtliche() mit Basis 10: '2015.05.28 16.31.19' –

+0

In meinem Code habe ich df mit 'dtype = 'str' definiert. Bei einem Fehler gehe ich davon aus, dass einige Spalten Spalten sind, also kann man dort keinen Text speichern. Versuchen Sie, df-Spalten als str zu definieren und nach dem Laden von Daten mit Typen zu manipulieren. – zuku

0

Unter der Annahme, dass df leer ist, und hat die gleichen Spalten wie der uRL-Dictionary-Schlüssel, dh

list(df) 
#[u'alternate_product_code', 
# u'availability', 
# u'boz', 
# ... 

len(df) 
#0 

dann können Sie pandas.append

for url in links: 
    url_data = urllib2.urlopen(str(url)).read() 
    url_dict = json.loads(url_data) 
    a_dict = { k:pandas.Series([str(v)], index=[0]) for k,v in url_dict.iteritems() } 
    new_df = pandas.DataFrame.from_dict(a_dict) 
    df.append(new_df, ignore_index=True) 

Nicht zu sicher verwenden, warum Ihr Code wird nicht funktionieren, aber die folgenden paar Änderungen berücksichtigen, die Dinge bereinigen sollte, sollten Sie es noch verwenden möchten:

for row,url in enumerate(links): 
    data  = urllib2.urlopen(str(url)).read() 
    data_dict = json.loads(data) 
    for key,val in data_dict.items(): 
     if key in list(df): 
      df.ix[row,key] = val 

verwendete ich enumerate über den Index und den Wert des Links Array zu durchlaufen, auf diese Weise Sie einen Index-Zähler nicht brauchen (row in Ihrem Code) und dann habe ich die .items Wörterbuch Methode, so kann ich über Schlüssel und Werte iterieren bei Einmal. Ich glaube, Pandas werden automatisch mit den leeren Datenrahmeneinträgen umgehen.

Verwandte Themen