2015-07-29 2 views
6

У меня есть набор URL-адресов, содержащих json-файлы, и пустой фрейм данных pandas с столбцами, представляющими атрибуты jsnon-файлов. Не все json-файлы имеют все атрибуты в фреймворке pandas. Мне нужно сделать, чтобы создать словари из json-файлов, а затем добавить каждый словарь в базу данных pandas как новую строку, и в случае, если json-файл не имеет атрибута, соответствующего столбцу в фреймворке данных, это должно быть заполненный пробел.Как добавить словарь в базу данных pandas?

мне удалось создать словари, как:

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) 

, а затем я попытался создать цикл следующим образом:

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 

где ДФ является dataframe и ссылки есть множество адресов

Однако, я получаю следующее сообщение об ошибке:

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

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

где [ «2_seater_depth_mm»] является первый столбец панд dataframe

ответ

4

Для меня ниже код работает:

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] 

Вы перепутали порядок аргументов в .loc() и имеют один гораздо []

+0

это дает мне эту ошибку: другие = np.array (другой, DTYPE = 'i8') ValueError: недопустимый буквальным долго() с основанием 10: '2015-05-28 16:31:19' –

+0

В моем коде я определил df с 'dtype = 'str'' От ошибки Я предполагаю, что некоторые из ваших столбцов являются int, поэтому вы не можете хранить там текст. Попробуйте определить столбцы df как str и после загрузки данных манипулировать с помощью типов. – zuku

0

Предполагая, что df пуст и имеет те же столбцы в качестве ключей словаря URL-адрес, то есть

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

len(df) 
#0 

, то вы можете использовать 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) 

Не слишком уверен, почему ваш код не будет работать, но учтите следующие несколько изменений, которые должны очистить вещи, вы должны по-прежнему хотите использовать:

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 

Я использовал enumerate для итерации по индексу и значению ссылок массива, таким образом, вам не нужен индексный счетчик (row в коде), а затем я использовал метод .items словаря, так что я могу перебрать ключ и значения в один раз. Я считаю, что pandas автоматически обрабатывает пустые записи в dataframe.

Смежные вопросы