熊猫read_sql_query在某些列中的所有值均返回None

时间:2018-11-15 08:18:01

标签: python pandas sqlalchemy nan nonetype

我正在使用pandas read_sql_query将MySQL数据库表中的数据读取到pandas数据框中。该表中的某些列具有所有NULL值。对于这些列,pandas数据帧的每一行均不包含任何内容。对于所有其他列,数据框包含NaN(其中存在NULL值)。谁能解释为什么所有NULL列都不返回None?以及如何确保我拥有所有的NaN,希望不进行手动转换? 我应该添加引起此问题的两列为float列,第三列为double类型,

编辑

这里是一个例子。 pef和fer列包含数据库中的所有NULL。

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。

2 个答案:

答案 0 :(得分:1)

问题是一个未解决的问题,在这里进行了解释:此处:https://github.com/pandas-dev/pandas/issues/14314

  

read_sql_query只返回结果集,没有任何列类型   信息。如果使用read_sql_table函数,那么它将使用   通过SQLAlchemy获得列类型信息。

似乎read_sql_query只检查列中返回的前3个值,以确定列的类型。因此,如果前三个值为NULL,则无法确定列的类型,因此返回None。

因此,部分解决方法是使用read_sql_table。我将代码更改为使用read_sql_table,即使对于所有NULL列,它也会按预期返回NaN值。但是在我的实际应用程序中,我确实需要使用read_sql_query。所以现在返回结果后,我立即用NaN替换任何None值:

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

答案 1 :(得分:0)

我尝试使用read_sql_table,但它不能为我解决此问题。此外,我发现被接受的答案实际上还会导致其他问题。

对于我的数据,只有pandas认为是对象的列才具有“ None”而不是NaN。对于日期时间,丢失的是NaT。对于浮点数,缺失为NaN。

read_sql_table对我不起作用,并返回与read_sql相同的问题。因此,我尝试了接受的答案并运行df.replace([None],np.nan,inplace = True)。这实际上将我所有缺少数据的datetime对象更改为dtypes对象。因此,现在我不得不将它们更改回datetime,这可能会给您增加负担,具体取决于数据的大小。

相反,建议您首先在df中标识对象dtype字段,然后替换None:

obj_columns = list(df.select_dtypes(include=['object']).columns.values)
df[obj_columns] = df[obj_columns].replace([None], np.nan)