2015-11-03 51 views
8

Tôi có API trả về một hàng dữ liệu làm từ điển Python. Hầu hết các khóa đều có một giá trị duy nhất, nhưng một số khóa có giá trị là danh sách (hoặc thậm chí danh sách danh sách hoặc danh sách từ điển).Pandas DataFrame từ điển với danh sách

Khi tôi ném từ điển vào pd.DataFrame để cố gắng chuyển đổi từ điển thành một khung dữ liệu gấu trúc, nó ném một lỗi "Mảng phải có cùng độ dài". Điều này là do nó không thể xử lý các khóa có nhiều giá trị (tức là các khóa có giá trị của danh sách).

Làm cách nào để có được gấu trúc coi các danh sách đó là 'các giá trị duy nhất'?

Như một ví dụ giả thuyết:

data = { 'building': 'White House', 'DC?': True, 'occupants': ['Barack', 'Michelle', 'Sasha', 'Malia'] } 

tôi muốn biến nó thành một DataFrame như thế này:

ix building   DC?  occupants 
0 'White House' True  ['Barack', 'Michelle', 'Sasha', 'Malia'] 
+0

bạn có biết trước cấu trúc của dữ liệu đến ở? – AbtPst

+1

Nói chung, có. Trong ví dụ giả định, 'tòa nhà' sẽ luôn là một chuỗi duy nhất và 'DC?' sẽ luôn là một boolean duy nhất. Nhưng độ dài của danh sách 'người cư ngụ' có thể thay đổi tùy thuộc vào tòa nhà được truy vấn. Câu trả lời đó có đáp ứng được câu hỏi của bạn không? –

+0

chính xác, vì vậy tôi đã suy nghĩ, tạo một khung dữ liệu trống đầu tiên và sau đó tiếp tục thêm hàng vào nó. Tuy nhiên, lưu ý rằng như Andy đã chỉ ra, điều này có thể không hiệu quả – AbtPst

Trả lời

7

này hoạt động nếu bạn vượt qua một danh sách (dòng):

In [11]: pd.DataFrame(data) 
Out[11]: 
    DC?  building occupants 
0 True White House Barack 
1 True White House Michelle 
2 True White House  Sasha 
3 True White House  Malia 

In [12]: pd.DataFrame([data]) 
Out[12]: 
    DC?  building       occupants 
0 True White House [Barack, Michelle, Sasha, Malia] 
+1

Giải pháp này cũng hoạt động với danh sách danh sách và danh sách từ điển. 'data = {'building': 'Nhà Trắng', 'DC?': Đúng, 'người cư ngụ': ['Barack', 'Michelle', 'Sasha', 'Malia'], 'list_of_lists': [[1, 2,3], [4,5,6]], 'list_of_dicts': [{'a': 1, 'b': 2}, {'c': 3, 'd': 4}]} ' – Alexander

1

nếu bạn biết các phím của từ điển trước đó, tại sao không đầu tiên tạo ra một sản phẩm nào khung dữ liệu và sau đó tiếp tục thêm hàng?

+1

Điều này không hiệu quả vì gấu trúc tạo một bản sao mới cho mỗi lần chèn (do đó việc xây dựng một DataFrame theo cách này là O (n^2) trong số hàng). –

1

Nó sẽ được chấp nhận nếu thay vì có một entry với một danh sách các cư dân, bạn có mục riêng cho mỗi người cư ngụ? Nếu vậy bạn chỉ có thể làm

n = len(data['occupants']) 
for key, val in data.items(): 
    if key != 'occupants': 
     data[key] = n*[val] 

EDIT: Thực ra, tôi nhận được hành vi này trong gấu trúc (ví dụ: chỉ với pd.DataFrame(data)) thậm chí không có tiền xử lý này. Phiên bản nào bạn đang sử dụng?

1

này hóa ra là rất tầm thường vào cuối

data = { 'building': 'White House', 'DC?': True, 'occupants': ['Barack', 'Michelle', 'Sasha', 'Malia'] } 
df = pandas.DataFrame([data]) 
print df 

mà kết quả trong:

DC?  building       occupants 
0 True White House [Barack, Michelle, Sasha, Malia] 
Các vấn đề liên quan