【问题标题】:Pandas read_sql_query returning None for all values in some columnsPandas read_sql_query 为某些列中的所有值返回 None
【发布时间】:2019-04-18 07:04:46
【问题描述】:

我正在使用 pandas read_sql_query 将数据从 MySQL 数据库表读取到 pandas 数据帧中。此表中的某些列具有所有 NULL 值。对于这些列,pandas 数据框的每一行都包含 None 。对于所有其他列,数据框包含 NaN,其中存在 NULL 值。谁能解释为什么所有 NULL 列都返回 None ?以及如何确保我拥有所有 NaN,希望不进行手动转换? 我应该补充一点,导致这个问题的两列是浮动的,第三列是双精度的,

编辑

这是一个例子。 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。

【问题讨论】:

  • 您能否添加一个最小示例,说明您的数据在数据库中的样子、使用 Pandas 解析它们时的样子以及您希望它们出现的样子?只需编辑您的问题以包括那些+您当前正在使用的任何代码。

标签: python pandas sqlalchemy nan nonetype


【解决方案1】:

这个问题是一个未解决的问题,在这里解释:这里: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,即使对于所有NULL 列,它也会按预期返回NaN 值。但在我的实际应用程序中,我确实需要使用read_sql_query.,所以我现在在返回结果后立即用 NaN 替换任何 None 值:

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

【讨论】:

  • 非常有帮助。但是出于兴趣,为什么您真的需要在应用程序中使用 read_sql_query 而不是 read_sql_table?
  • @Andy,举个例子:如果您只需要表格的一个子集并且读取完整的表格也会返回很多记录,则不能使用read_sql_table
【解决方案2】:

我尝试使用 read_sql_table 并没有解决我的问题。此外,我发现接受的答案实际上会产生其他问题。

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

read_sql_table 对我不起作用,并返回与 read_sql 相同的问题。然后我尝试了接受的答案并运行了 df.replace([None], np.nan, inplace=True)。这实际上将我所有缺少数据的日期时间对象更改为对象 dtypes。所以现在我必须将它们改回日期时间,这可能会根据您的数据大小而产生负担。

相反,我建议您首先确定 df 中的 object dtype 字段,然后替换 None:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2018-10-13
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多