2015-06-04 18 views
6

Quando faccioRegola i panda read_sql_query Trattamento del valore NULL?

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 

il risultato è una colonna di None valori al contrario di float("nan"). Questo è piuttosto fastidioso se specialmente leggi le colonne float con valori NULL a chunk-wise.

La versione read_sql_table funziona correttamente, poiché suppongo che possa utilizzare le informazioni sul tipo.

Esiste un modo semplice per regolare read_sql_query anche per interpretare i valori NULL come float("nan")?

+0

Ho paura che non ci sia un modo semplice. Pandas non converte tutti i Nones (ad es. 'Pd.Series ([None, None])' non fornisce alcun valore e non NaN) ma li mantiene come oggetto, e 'read_sql_query' non può mai sapere che si suppone che siano float. Se * tu * sai avanzare quali colonne devono essere float, puoi fare un 'df ['a']. Astype (float)' su quella colonna. – joris

+0

Ma sono d'accordo che questo è un problema è un caso del genere. Un possibile argomento di parole chiave per specificare il tipo per una determinata colonna (come 'dtype' in' read_csv') potrebbe essere utile qui. È sempre possibile aprire un problema su https://github.com/pydata/pandas/issues – joris

+0

o un parametro 'converters', anche come' read_csv', se possibile – vmg

risposta

0

Sembra an issue è stato sollevato e qualcosa di simile - l'argomento coerce_float - è stato aggiunto al panda nella versione 0.7.2, secondo il commento di wesm nella pagina collegata:

hi Arthur, ho aggiunto un'opzione coerce_float (nel commit precedente) che converte Decimal -> float e riempie None con NaN. La conversione del decimale in virgola mobile è ancora molto lenta. Sarà parte di 0.7.2 per essere rilasciato presto

Anche se la descrizione nel pandas.read_sql_query 0.18.1 docs sembra confuso:

coerce_float: booleano, predefinito Vero

tentativo di convertire i valori di non stringa , oggetti non numerici (come decimal.Decimal) a virgola mobile, utili per set di risultati SQL

+0

Per l'esempio precedente non sembra fare la differenza :( – Gerenuk

+0

Questo è deludente, ha risolto un problema correlato che ho dovuto affrontare, quindi penso che dovrebbe essere una risposta qui. Nel tuo caso, penso che dovresti sollevare un problema correlato su github e aggiorna/rispondi alla domanda con i risultati. – vmg

Problemi correlati