一尘不染

Python Pandas使用NaN值写入sql

mysql

我正在尝试从ascii读取几百张表,然后将它们写入mySQL。使用Pandas似乎很容易,但是我遇到了一个对我来说没有意义的错误:

我有一个8列的数据框。这是列列表/索引:

metricDF.columns

Index([u'FID', u'TYPE', u'CO', u'CITY', u'LINENO', u'SUBLINE', u'VALUE_010', u'VALUE2_015'], dtype=object)

然后to_sql,我使用追加数据到mySQL

metricDF.to_sql(con=con, name=seqFile, if_exists='append', flavor='mysql')

我收到关于列为“ nan”的奇怪错误:

OperationalError: (1054, "Unknown column 'nan' in 'field list'")

如您所见,我所有的列都有名称。我意识到mysql / sql对编写的支持出现在开发中,所以也许这是原因?如果是这样,是否可以解决?任何建议将不胜感激。


阅读 1125

收藏
2020-05-17

共1个答案

一尘不染

更新 :从pandas
0.15开始,to_sql支持写入NaN值(它们将NULL在数据库中写入),因此不再需要下面描述的解决方法(请参阅https://github.com/pydata/pandas/pull/8208)。
熊猫0.15将于10月发布,并且该功能已合并到开发版本中。


这可能是由于NaN你的表值,这是目前该大熊猫SQL函数不处理的NaN以及一个已知的缺点(https://github.com/pydata/pandas/issues/2754HTTPS:/
/github.com/pydata/pandas/issues/4199)

作为目前的一种解决方法(对于0.14.1及更低版本的熊猫),您可以使用以下方法将nan值手动转换为None:

df2 = df.astype(object).where(pd.notnull(df), None)

然后将数据帧写入sql。但是,这会将所有列转换为对象dtype。因此,您必须基于原始数据框创建数据库表。例如,如果您的第一行不包含NaNs:

df[:1].to_sql('table_name', con)
df2[1:].to_sql('table_name', con, if_exists='append')
2020-05-17