调整pandas read_sql_query NULL 值处理?

Posted

技术标签:

【中文标题】调整pandas read_sql_query NULL 值处理?【英文标题】:Adjust pandas read_sql_query NULL value treatment? 【发布时间】:2015-08-19 13:45:39 【问题描述】:

当我这样做时

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

结果是一列None 值,而不是float("nan")。这很烦人,尤其是当您读取具有 NULL 值的浮点列时。

read_sql_table 版本工作正常,因为我想它可以使用类型信息。

有没有一种简单的方法可以调整read_sql_query 以将NULL 值也解释为float("nan")

【问题讨论】:

恐怕没有简单的方法。 Pandas 不会转换所有的 None(例如 pd.Series([None, None]) 给你 None 值而不是 NaN)但将它们保留为对象,read_sql_query 永远不会知道它应该是浮点数。如果知道哪些列必须是浮动的,则可以在该列上执行df['a'].astype(float) 但我同意这是一个问题。用于指定特定列类型的可能关键字参数(如read_csv 中的dtype)可能在这里有用。您可以随时在github.com/pydata/pandas/issues 上打开问题 converters 参数,也可以像read_csv 一样 这有什么更新吗? 【参考方案1】:

根据 wesm 在链接页面中的评论,似乎 an issue 被提出,并且类似的东西 - coerce_float 参数 - 在版本 0.7.2 中被添加到 pandas:

嗨亚瑟,我添加了一个选项 coerce_float(在上面的提交中),它转换 Decimal -> float 并用 NaN 填充 None。将 Decimal 转换为 float 仍然非常慢。将成为即将发布的 0.7.2 的一部分

虽然pandas.read_sql_query 0.18.1 docs 中的描述似乎令人困惑:

coerce_float : 布尔值,默认为真

尝试将值转换为非字符串、非数字对象(如 decimal.Decimal)为浮点,这对 SQL 结果集很有用

【讨论】:

对于上面的例子,它似乎没有什么区别:( 这令人失望。它解决了我面临的一个相关问题,所以我认为它值得在这里回答。在您的情况下,我认为您应该在 github 上提出相关问题并使用结果更新/回答问题。 对我的情况也没有影响 这可能是解释:***.com/a/53330130/1509695

以上是关于调整pandas read_sql_query NULL 值处理?的主要内容,如果未能解决你的问题,请参考以下文章

pandas.read_sql_query() 如何查询 TEMP 表?

相当于 numpy 数组的 pandas read_sql_query?

将列表绑定到 Pandas read_sql_query 中的参数与其他参数

带有提交的 Airflow + pandas read_sql_query()

pd.read_sql_query 单/双引号格式化

pd.read_sql字符类型