2016-02-24 38 views
5

Tôi muốn chuyển đổi một truy vấn psycopg2 DictRow đến một dataframe gấu trúc, nhưng gấu trúc vẫn tiếp tục phàn nàn:Chuyển đổi psycopg2 DictRow truy vấn để Pandas dataframe

curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) 
curs.execute("SELECT * FROM mytable") 
data = curs.fetchall() 

print type(data) 
print pd.DataFrame(list(data)) 

Tuy nhiên, tôi luôn nhận được một lỗi mặc dù tôi đặc biệt thông qua một list ?? ?

<type 'list'> 
TypeError: Expected list, got DictRow 

Kết quả là tương tự nếu tôi làm pd.DataFrame(data) Ai đó có thể giúp tôi thực hiện công việc này?

Cũng sẽ tốt nếu tên cột của khung dữ liệu hoạt động (ví dụ: trích xuất DictRow và chuyển chúng vào khung dữ liệu).

Cập nhật:
Vì tôi cần phải xử lý dữ liệu, tôi muốn sử dụng dữ liệu từ các truy vấn psycopg2 như là và không phải là pandas approach, ví dụ read_sql_query.

+0

Đã mở một sự cố trên GitHub: https://github.com/pydata/pandas/issues/14169 – n1000

Trả lời

5

Hmm, tôi cuối cùng đã tìm thấy giải pháp hacky này:

print pd.DataFrame([i.copy() for i in data]) 

Các copy() chức năng của lớp DictRow sẽ trả về một từ điển thực tế. Với việc hiểu danh sách, tôi tạo ra một danh sách các từ điển (giống hệt), mà Pandas sẽ vui vẻ chấp nhận.

Tôi vẫn đang bối rối vì sao list(data) đã tạo ra một TypeError. Có lẽ ai đó vẫn có thể khai sáng cho tôi.

3

CẬP NHẬT: pandas.read_sql_query() là cách thanh lịch hơn để đọc truy vấn SQL vào một khung dữ liệu mà không cần psycopg2. Xem pandas docs.

Tôi đã gặp sự cố tương tự. Cách dễ nhất tôi tìm thấy là chuyển đổi DictRow thành một mảng có nhiều mảng.

import numpy as np 
curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) 
curs.execute("SELECT * FROM mytable") 
data = curs.fetchall() 

print type(data) 
print pd.DataFrame(np.array(data)) 

Nếu bạn muốn lấy tên cột, bạn có thể truy cập chúng dưới dạng khóa cho mỗi hàng của DictRow. Tuy nhiên, việc chuyển đổi thành một mảng có khối u không bảo toàn thứ tự. Vì vậy, một cách (không thích hợp) như sau:

curs = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) 
curs.execute("SELECT * FROM mytable") 
data = curs.fetchall() 

print type(data) 
colNames = data[0].keys() 
print pd.DataFrame([[row[col] for col in colNames] for row in data], columns=colNames) 
Các vấn đề liên quan