2015-06-04 17 views
6

Kiedy zrobićDostosuj pandy read_sql_query NULL traktowania wartości?

from sqlalchemy import create_engine 
import pandas as pd 

engine = create_engine('sqlite://') 
conn = engine.connect() 
conn.execute("create table test (a float)") 
for _ in range(5): 
    conn.execute("insert into test values (NULL)") 

df = pd.read_sql_query("select * from test", engine) 
#df = pd.read_sql_table("test", engine) 
df.a 

wynik jest kolumna None wartości w przeciwieństwie do float("nan"). Jest to dość denerwujące, szczególnie jeśli czytasz kolumny zmiennoprzecinkowe z wartościami NULL.

Wersja read_sql_table działa dobrze, ponieważ przypuszczam, może wykorzystywać informacje typu.

Czy istnieje prosty sposób, aby dostosować read_sql_query do interpretacji wartości NULL jako float("nan")?

+0

Obawiam się, że nie ma łatwego sposobu. Pandy nie konwertują wszystkich Nonów (np. 'Pd.Series ([None, None])' daje wartości None, a nie NaN), ale zachowuje je jako obiekt, a 'read_sql_query' nigdy nie wie, że miały być pływające. Jeśli * ty * wiesz, że przesuwasz kolumny, które mają być pływające, możesz zrobić "df [" a "]. Astype (float)' w tej kolumnie. – joris

+0

Ale zgadzam się, że to jest taki problem. Możliwy tutaj może być argument argumentów możliwych do określenia typu dla pewnej kolumny (np. 'Dtype' w' read_csv'). Zawsze można otworzyć problem w https://github.com/pydata/pandas/issues – joris

+0

lub 'converters' parametru, jak również' read_csv', jeśli w ogóle możliwe – vmg

Odpowiedz

0

Wydaje an issue został podniesiony i coś podobnego - w coerce_float argumentem - dodano do pand w wersji 0.7.2, zgodnie z komentarzem wesm w połączonej strony:

Cześć Artur, dodałem opcję coerce_float (w powyższym commit), który konwertuje Decimal -> float i wypełnia None przy pomocy NaN. Konwertowanie wartości dziesiętnej na zmienną jest nadal bardzo powolne. Będzie częścią 0.7.2 ma zostać wydany wkrótce

Chociaż opis w pandas.read_sql_query 0.18.1 docs wydaje mylące:

coerce_float: boolean, domyślnie prawda

Próba konwersji wartości non-string , nieliczbowe obiekty (takie jak dziesiętny.Dekimal) do zmiennoprzecinkowego, przydatne dla zestawów wyników SQL

+0

Na powyższym przykładzie nie wydaje się, aby różnica :( – Gerenuk

+0

To rozczarowujące. To rozwiązał problem związany wychodził, więc myślę, że gwarantuje bycia odpowiedź tutaj. W twoim przypadku, myślę, że należy podnieść kwestię powiązany na github i zaktualizuj/odpowiedz na pytanie z wynikami. – vmg