答案 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})