2016-02-24 25 views
5

Chciałbym przekonwertować psycopg2 DictRow zapytania do dataframe pandy, ale wciąż pandy skarży:Konwersja psycopg2 DictRow zapytanie do Pandy 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)) 

Ja jednak zawsze pojawia się błąd, chociaż specjalnie uchwalił list ?? ?

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

Rezultat jest taki sam jeśli ja pd.DataFrame(data) Może ktoś mi pomóc dokonać tej pracy?

Byłoby również miło, gdyby działały nazwy kolumn ramki danych (tj. Wyodrębnić DictRow i przekazać je do ramki danych).

Update:
Ponieważ potrzebne do przetwarzania danych, jak na to, że korzystając z danych z zapytaniem psycopg2 jak i nie pandas approach np read_sql_query.

+0

Otworzył wydanie na GitHub: https://github.com/pydata/pandas/issues/14169 – n1000

Odpowiedz

5

Hm ostatecznie znaleźć rozwiązanie tego hacky:

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

copy() funkcją klasy DictRow powróci rzeczywistej słownika. Ze zrozumieniem listy tworzę listę (identycznych) słowników, które Pandy z radością zaakceptują.

Nadal jestem zdziwiony, dlaczego list(data) wyprodukował TypeError. Może ktoś jeszcze może mnie oświecić.

3

AKTUALIZACJA: pandas.read_sql_query() to bardziej elegancki sposób na odczytanie zapytania SQL w ramce danych, bez potrzeby dodawania psycopg2. Zobacz pandas docs.

Mam taki sam problem. Najłatwiej znalazłem konwertowanie DictRow na tablicę numpy.

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)) 

Jeśli chcesz uzyskać nazwy kolumn, można uzyskać do nich dostęp jako klucze dla każdego wiersza DictRow. Konwersja do tablicy numpy nie zachowuje jednak kolejności. Tak więc jeden (nieelegancki) sposób jest następujący: