Панды read_sql_query, возвращающие None для всех значений в некоторых столбцах - PullRequest
0 голосов
/ 15 ноября 2018

Я использую pandas read_sql_query для чтения данных из таблицы базы данных MySQL в фрейм данных pandas.Некоторые столбцы в этой таблице имеют все значения NULL.Для этих столбцов pandas dataframe содержит None в каждой строке.Для всех остальных столбцов информационный кадр содержит NaN, где было значение NULL.Может кто-нибудь объяснить, почему None возвращается для всех столбцов NULL?И как мне убедиться, что у меня есть все NaN, надеюсь, без ручного преобразования?Я должен добавить, что два из столбцов, вызывающих эту проблему, являются float, а третий имеет тип double,

EDIT

Вот пример.Столбцы pef и fer содержат все NULLS в базе данных.

from sqlalchemy import create_engine
import pandas as pd
import math

querystr = "SELECT * FROM dbname.mytable"
engine = create_engine('mysql+pymysql://username:password@localhost/' + "dbname")
df = pd.read_sql_query(querystr, engine)
df.head()

    sys     dias    pef     fer
0   NaN     NaN     None    None
1   159.0   92.666  None    None
2   NaN     NaN     None    None
3   NaN     NaN     None    None
4   102.0   63.333  None    None

В базе данных MySQL эти столбцы определены как:

Columns: 
    sys float 
    dias float 
    pef float 
    fer float

Я ожидаю, что столбцы pef и fer будут содержать NaN в каждой строке, а не None.

1 Ответ

0 голосов
/ 16 ноября 2018

Эта проблема является открытой и объясняется здесь: здесь: https://github.com/pandas-dev/pandas/issues/14314

read_sql_query просто возвращает наборы результатов без какой-либо информации о типе столбца.Если вы используете функции read_sql_table, там он использует информацию о типе столбца через SQLAlchemy.

Похоже, что read_sql_query проверяет только первые 3 значения, возвращенные в столбце, чтобы определить тип столбца.Поэтому, если первые 3 значения равны NULL, он не может определить тип столбца и поэтому возвращает None.

Таким образом, частичный обходной путь должен использовать read_sql_table.Я изменил свой код, чтобы использовать read_sql_table, и он возвращает значения NaN, как и ожидалось, даже для всех столбцов NULL.Но в моем реальном приложении мне действительно нужно использовать read_sql_query.Поэтому теперь я заменяю любые значения None на NaN, как только результаты будут возвращены:

df.replace([None], np.nan, inplace=True)
...