2015-07-29 38 views
6

Tôi có một tập hợp các url chứa các tệp json và một khung dữ liệu pandas rỗng với các cột đại diện cho các thuộc tính của các tệp jsnon. Không phải tất cả các tệp json đều có tất cả các thuộc tính trong khung dữ liệu gấu trúc. Những gì tôi cần làm là tạo từ điển trong số các tệp json và sau đó nối từng từ điển vào khung dữ liệu gấu trúc dưới dạng hàng mới và, trong trường hợp tệp json không có thuộc tính khớp với một cột trong khung dữ liệu, điều này phải là đầy trống.Làm cách nào để nối thêm từ điển vào một khung dữ liệu gấu trúc?

tôi quản lý để tạo ra các từ điển như:

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) 

và sau đó tôi đã cố gắng để tạo ra một vòng lặp for như sau:

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 

nơi df là dataframe và các liên kết là tập hợp của các url

Tuy nhiên, tôi nhận được lỗi sau:

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

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

nơi [ '2_seater_depth_mm'] là cột đầu tiên của gấu trúc dataframe

Trả lời

4

Đối với tôi dưới đây đang hoạt động:

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] 

Bạn đã trộn trật tự của các đối số trong .loc() và có một đến nhiều []

+0

nó mang lại cho tôi lỗi này: other = np.array (khác, dtype = 'i8') ValueError: chữ không hợp lệ cho dài() với cơ số 10: '2015-05-28 16:31:19' –

+0

Trong mã của tôi, tôi đã định nghĩa df với 'dtype = 'str'' Từ lỗi, tôi giả định rằng một số cột của bạn là ints, vì vậy bạn không thể lưu trữ văn bản ở đó. Hãy thử xác định các cột df là str và sau khi tải dữ liệu thao tác với các loại. – zuku

0

Giả sử rằng df trống và có cùng cột với các phím từ điển url, nghĩa là

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

len(df) 
#0 

sau đó bạn có thể sử dụng 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) 

Không quá chắc chắn tại sao mã của bạn sẽ không hoạt động, nhưng xem xét vài chỉnh sửa sau đó nên rửa sạch mọi thứ lên, nên bạn vẫn muốn sử dụng nó:

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 

Tôi đã sử dụng enumerate để lặp qua chỉ mục và giá trị của mảng liên kết, theo cách này bạn không cần bộ đếm chỉ mục (row trong mã của mình) và sau đó tôi đã sử dụng phương thức từ điển .items, vì vậy tôi có thể lặp qua khóa và giá trị Một lần. Tôi tin rằng gấu trúc sẽ tự động xử lý các mục nhập dataframe trống.

Các vấn đề liên quan