第一个SO问题。我希望这足以说明问题。
Pandas 0.25,Oracle 11g
我有一个从csv读取的数据框。它包含数字,字符串和日期数据的组合。
我使用.astype(str)
,.astype(int)
和.to_datetime
在数据框中强制使用数据类型。
然后我创建一个dtype字典以选择所需的数据类型。
当数字列types.NUMBER
和types.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的字符串问题实际上是一个被捕获且处理错误的异常的问题。
数字仍然是一个必须单独处理的问题,我将在解决方案中添加答案。
答案 0 :(得分:0)
带有一些null和一些非null值的数字字段的问题是由于熊猫使用NaN表示null和numpy将NaN视为浮点数。
.astype(int)
不处理NaN,实际上由于NaN(在我的情况下try块已捕获并处理不正确)而引发了异常。
解决方案是:df['pref1'] = df['pref1'].astype('Int64')
“ Int64”需要大写的“ I”。 .astype('int64')
也不起作用。