【发布时间】:2016-10-14 07:04:39
【问题描述】:
【问题讨论】:
【问题讨论】:
如前所述,问题在于 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})
【讨论】:
问题是您的数据包含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
虽然这似乎是一个沉重的权衡,但在实践中,我发现在实践中这是一个问题的案例很少。在下一节中对这里的动机进行了一些解释。
【讨论】:
NaN 替换为0 吗?喜欢df['colname'] = df['colname'].fillna().astype(int) 或df = df.fillna(0).astype(int)?
integer na 并引发错误,那么就不会。