Pandas 读取的 sql 整数变为浮点数

Posted

技术标签:

【中文标题】Pandas 读取的 sql 整数变为浮点数【英文标题】:Pandas read sql integer became float 【发布时间】:2016-10-14 07:04:39 【问题描述】:

我遇到一个问题,当我使用pandas读取mysql表时,一些列(参见'to_nlc')曾经是整数变成了浮点数(之后自动添加.0)。 任何人都可以弄清楚吗?还是一些猜测?非常感谢!

【问题讨论】:

【参考方案1】:

如前所述,问题在于 pandas 的整数无法处理 NULL/NA 值。

您可以将 read_sql_table 替换为 read_sql 并将 NULL 转换为某个整数值(例如 0 或 -1,在您的设置中具有 NULL 意义):

df = pandas.read_sql("SELECT col1, col2, IFNULL(col3, 0) FROM table", engine)

这里col3在mysql中可以为NULL,如果为NULL则返回0,否则返回col3值。

或者用小函数助手做同样的事情:

def read_sql_table_with_nullcast(table_name, engine, null_cast=):
    """
    table_name - table name
    engine - sql engine
    null_cast - dictionary of columns to replace NULL:
           column name as key value to replace with as value.
           for example 'col3':0 will set all NULL in col3 to 0
    """
    import pandas
    cols = pandas.read_sql("SHOW COLUMNS FROM " + table_name, engine)
    cols_call = [c if c not in null_cast else "ifnull(%s,%d) as %s"%(c,null_cast[c],c) for c in cols['Field']]
    sel = ",".join(cols_call)
    return pandas.read_sql("SELECT " + sel + " FROM " + table_name, engine)

read_sql_table_with_nullcast("table", engine, 'col3':0)

【讨论】:

【参考方案2】:

问题是您的数据包含NaN 值,因此int 会自动转换为float

我想你可以查看NA type promotions:

当通过重新索引或其他方式将 NA 引入现有 Series 或 DataFrame 时,布尔和整数类型将被提升为不同的 dtype 以存储 NA。下表总结了这些:

Typeclass   Promotion dtype for storing NAs
floating    no change
object      no change
integer     cast to float64
boolean     cast to object

虽然这似乎是一个沉重的权衡,但在实践中,我发现在实践中这是一个问题的案例很少。在下一节中对这里的动机进行了一些解释。

【讨论】:

如何避免这种情况?整数用作标识符,以便转换为浮点数会导致精度错误 @HananShteingart - 可以将NaN 替换为0 吗?喜欢df['colname'] = df['colname'].fillna().astype(int)df = df.fillna(0).astype(int) 我已经从 SQL 中得到它作为浮点数。我所做的是将列转换为 sql 查询中的字符串:例如CAST(bigint_column AS VARCHAR) 所以我将它作为数据框中的字符串获取。我不介意它不再是数字,因为该列无论如何都代表一个 ID。 这个答案有更新吗?我见过pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html @MartinThoma - 老实说不知道,如果使用 integer na 并引发错误,那么就不会。

以上是关于Pandas 读取的 sql 整数变为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

Hive/Bigsql Pandas 将浮点数转换为整数,使用 pyarrow 将空值转换为镶木地板文件

pandas创建内容全是0的dataframepandas基于随机整数随机浮点数创建dataframe(random numbers)

将 pandas 数据框列标签从浮点数转换为整数

将 csv 文件作为浮点数读取到 pandas 数据帧

组态王使用485如何读取仪表浮点数?

Pandas to_dict 意外修改浮点数