首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当列包含空值时,Pandas to_sql忽略数据类型

当列包含空值时,Pandas to_sql忽略数据类型
EN

Stack Overflow用户
提问于 2020-07-24 15:56:37
回答 1查看 488关注 0票数 0

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

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),并且数据类型为types.VARCHAR(300),则这些列也将在Oracle中创建为FLOAT

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

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

日期列中的空值,即使整个列都为空值也是如此,并根据请求在Oracle中创建一个DATE

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-24 18:10:44

带有一些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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63069276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档