当列包含空值时,熊猫to_sql会忽略dtype

第一个SO问题。我希望这足以说明问题。

Pandas 0.25,Oracle 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,我需要使用null来作为null。

即使整个列为空值,日期列中的空值仍然有效,并根据请求在Oracle中创建DATE

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

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

iCMS 回答:当列包含空值时,熊猫to_sql会忽略dtype

带有一些null和一些非null值的数字字段的问题是由于熊猫使用NaN表示null和numpy将NaN视为浮点数。

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

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

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

This answer was helpful

本文链接:https://www.f2er.com/1873446.html

大家都在问