【问题标题】:Pandas to_sql ignoring dtype when column contains null values当列包含空值时,Pandas to_sql 忽略 dtype
【发布时间】:2020-07-24 07:56:37
【问题描述】:

第一个 SO 问题。我希望这足够描述性。

熊猫 0.25,甲骨文 11g

我有一个从 csv 读取的数据框。它包含数字、字符串和日期数据的混合。

我使用.astype(str).astype(int).to_datetime 强制数据框中的数据类型。

然后我创建一个 dtype 字典来选择我想要的数据类型。

当数字列types.NUMBERtypes.INTEGER 中有一些空值时,会在Oracle 表中创建一个FLOAT。应该是NUMBER(38,0),特别是如果我使用types.INTEGER。定义为 types.NUMBER 并包含所有非空整数的键列按预期创建为 NUMBER(38,0)

当存在全为空的列,但已应用 .astype(str) 且 dtype 为 types.VARCHAR(300) 时,这些列也在 Oracle 中创建为 FLOAT

我需要在 to_sql 中使用if_exists='append',因为表会收集历史记录,所以我不能等待 VARCHAR 列接收数据。虽然我在测试期间一直使用if_exists='replace 来确保删除并重新创建表。

有没有办法解决这些问题,由数据中的空值引起,导致数据类型选择不正确?我不应该需要在字符串中使用空格(即'')和整数中的0,我需要空值作为空值。

日期列中的空值,即使整个列都是空值也有效,并根据要求在 Oracle 中创建 DATE

编辑:字符串到 VARCHAR 问题实际上是一个捕获和错误处理异常的问题。

数字仍然是一个必须单独处理的问题,我将在解决方案中添加答案。

【问题讨论】:

    标签: python pandas oracle dtype pandas-to-sql


    【解决方案1】:

    带有一些 null 和一些非 null 值的数字字段的问题是由于 Pandas 将 NaN 用于 null 而 numpy 将 NaN 视为浮点数。

    .astype(int) 不处理 NaN,实际上由于 NaN 引发了异常(在我的情况下,try 块已捕获并错误处理)。

    解决办法是:df['pref1'] = df['pref1'].astype('Int64')

    “Int64”需要大写的“I”。 .astype('int64') 也不起作用。

    This answer was helpful

    【讨论】:

      猜你喜欢
      • 2021-05-21
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多