¿Cómo agregar un diccionario a un dataframe de pandas?

Tengo un conjunto de urls que contienen archivos json y un dataframe de pandas vacío con columnas que representan los atributos de los archivos jsnon. No todos los archivos json tienen todos los atributos en el dataframe de pandas. Lo que debo hacer es crear diccionarios a partir de los archivos json y luego agregar cada diccionario al dataframe pandas como una nueva fila y, en caso de que el archivo json no tenga un atributo que coincida con una columna en el dataframe, esto debe ser llenado en blanco

Me las arreglé para crear diccionarios como:

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) 

Y luego traté de crear un bucle for de la siguiente manera:

 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 

donde df es el dataframe y los enlaces es el conjunto de urls

Sin embargo, me sale el siguiente error:

 raise KeyError('%s not in index' % objarr[mask]) KeyError: "['2_seater_depth_mm'] not in index" 

donde [‘2_seater_depth_mm’] es la primera columna del dataframe de pandas

Para mí debajo del código funciona:

 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] 

Tiene un orden mixto de argumentos en .loc() y tiene uno a mucho []

Suponiendo que df está vacío y tiene las mismas columnas que las claves del diccionario de URL, es decir,

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

entonces puedes usar pandas.

 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) 

No está muy seguro de por qué su código no funcionará, pero considere las siguientes ediciones que deberían limpiar las cosas, si aún así desea usarlo:

 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 

Usé enumerate para iterar sobre el índice y el valor de la matriz de enlaces, de esta manera no necesita un contador de índice ( row en su código) y luego usé el método de diccionario .items , por lo que puedo iterar sobre la clave y los valores a la vez. Creo que los pandas manejarán automáticamente las entradas vacías del dataframe.