Pandas读取sql整数变为浮点数

时间:2016-06-13 18:38:19

标签: python mysql pandas int

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

enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:7)

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

我认为您可以查看NA type promotions

  

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

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

虽然这似乎是一个沉重的权衡,但实际上我发现很少有这种情况在实践中存在。在下一节中对动机的一些解释。

答案 1 :(得分:0)

如前所述,问题在于熊猫的整数不能处理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,则为null,否则返回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})