写入期望类型不是浮点数的数据库时如何处理 NaN 值?

Posted

技术标签:

【中文标题】写入期望类型不是浮点数的数据库时如何处理 NaN 值?【英文标题】:How to handle NaN values when writing to a database which expects something else than type:float? 【发布时间】:2022-01-20 14:04:00 【问题描述】:

我正在从事抓取项目,并且正在使用 Postgres。我已经手动设置了所有表格,其中包括典型的数据类型,如日期时间、整数、文本和浮点数。

但是我遇到了一个问题。由于我刮了很多字段,所以总是缺少一些字段,它们变成了 nan。而且由于 nan 是 float 类型,当我尝试将 float 值推送到需要例如 datetime 或 text 对象的 Column 时收到错误消息。

至少我是这么认为的。错误信息不是很清楚。

在我通过 SQLAlchemy 的 declarative_base 创建表之后,我基本上只使用 Pandas (df.to_sql)。

我的流程是这样的:

obj = Scrape() # Scrape() includes all relevant methods
obj.get_data()
obj.create_a_df()
obj.df.to_sql('table', con=engine, [...])

只要当前抓取 (obj.get_data()) 中的值不存在,它就会变为 nan。而且由于nan 的类型为float,我无法将其发布到除了float 之外的其他任何东西的表格中。

Error:
[SQL: INSERT INTO company_statistics (my column name) VALUES (my df_columns)]  [parameters: 
my data as dictionary]
(Background on this error at: https://sqlalche.me/e/14/9h9h)

不能很好地诊断它,但我希望它是上面描述的原因。有什么办法吗? df.fillna(None) 是否有意义,或者是否有任何我不知道的可用关键字?

【问题讨论】:

最好让python推断数据类型(让python创建将存储数据的表)然后规范化。或者在预期出错的列中使用字符串数据类型,然后进行规范化。 是的,但是如果我第一次让 python 推断数据类型,那并不能保证第二个数据集可以使用它。标准化是什么意思? 符合标准(例如数据类型)。 【参考方案1】:

您也可以考虑obj.df.dropna(inplace=True)。这将简单地删除任何列中包含NaN 的所有行。

【讨论】:

是的,典型的熊猫。这就像用工具打开一个旧抽屉,然后找到适合这项任务的那个。【参考方案2】:

去掉NaNs 不会解决这个问题吗?使用 .fillna() 会将所有 NaN 值替换为您在其中声明的任何值。你可以把它放在你的抓取方法中。

【讨论】:

以上是关于写入期望类型不是浮点数的数据库时如何处理 NaN 值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sum 函数时如何处理 Store 中的空值

使用 seaborn 绘图时如何处理缺失值?

从 DataAdapter 拉数据时如何处理 DBNull

从 Spark 写入镶木地板时如何处理空值

使用带有自动模式检索的 LoadJobs 时如何处理 Avro 到 BigQuery 的类型转换

C语言 浮点数的阶码和尾数的长度是有限制的,超过的部分该如何处理?会有啥影响?