【问题标题】:How to handle NaNs in pandas dataframe integer column to postgresql database如何将 Pandas 数据帧整数列中的 NaN 处理到 postgresql 数据库
【发布时间】:2018-10-29 01:04:59
【问题描述】:

我有一个带有“年”列的熊猫数据框。但是,由于外部合并,某些行具有 np.NaN 值。因此,pandas 中列的数据类型转换为 float64 而不是整数(整数不能存储 NaN?)。接下来,我想将数据框存储在 postGreSQL 数据库中。为此我使用:

df.to_sql()

一切正常,但我的 postGreSQL 列现在类型为“双精度”,并且 np.NaN 值现在为 [null]。这一切都是有道理的,因为输入列类型是 float64 而不是整数类型。

我想知道是否有一种方法可以将结果存储在带有 [nans] 的整数类型列中。

例如Notebook

阿米的回答结果:

【问题讨论】:

  • 试试df.astype(object).to_sql()再试一次?
  • @coldspeed 更改表架构 - 不确定是否有必要。
  • @AmiTavory 如果架构已经定义,那么我不这么认为。顺便说一句,fillna 不会灰心的... :)
  • @coldspeed 哦,很好 - 错过了。会更新。谢谢!
  • @coldspeed,结果在 postgreSQL 中仍然是双精度的。我在我的问题中添加了一个笔记本,以检查我的实现是否错误。

标签: postgresql pandas null integer nan


【解决方案1】:

(整数不能存储 NaN?)

不,他们不能。如果你看postgresql numeric documentation,你可以看到字节数和范围是完全指定的,整数不能存储这个。

在这种情况下,一个常见的解决方案是按照惯例确定某个数字在逻辑上是 nan。在您的情况下,如果是年份,您可能会选择一个负值(或仅 -1)。在写之前,你可以使用

df.year = df.year.fillna(-1).astype(int)

或者,您可以将另一列定义为year_is_none

或者,您可以将它们存储为浮点数。

这些解决方案在内存方面的效率从最高到最低。

【讨论】:

    【解决方案2】:

    你应该使用它;

    df.year = df.year.fillna(-1) OR 0
    

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 2019-03-28
      • 2017-12-24
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多