0

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

熊猫 0.25,甲骨文 11g

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

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

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

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

当存在所有为空的列但已.astype(str)应用并且types.VARCHAR(300)列的 dtype 也像FLOAT在 Oracle 中一样创建时。

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

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

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

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

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

4

1 回答 1

0

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

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

解决方案是:df['pref1'] = df['pref1'].astype('Int64')

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

这个答案很有帮助

于 2020-07-24T10:10:44.347 回答