【问题标题】:Converting NaN to Oracle Nulls within Python Pandas在 Python Pandas 中将 NaN 转换为 Oracle Null
【发布时间】:2018-06-26 05:25:46
【问题描述】:

执行以下函数时出现此错误,这是因为尝试将 NaN 插入数字列。始终用 0 替换 NaN 确实有效,但用 None 替换无效。任何想法将不胜感激

def insertData(table_name, schema_name, df):
    if not df.empty:

        #input_data[file].fillna(0, inplace=True) # This works but replacing with 0's is not ideal
        df.where(pd.notnull(df), None) #This does not work
        values = df.to_dict(orient='records')
        table = sa.Table(table_name , conndict['meta'], autoload=True, schema=schema_name)
        result_proxy = conndict['conn'].execute(table.insert(), values)
        return result_proxy
    else:
        return None

(cx_Oracle.DatabaseError) DPI-1055:值不是数字 (NaN),不能用于 Oracle 数字

【问题讨论】:

  • 顺便说一句 df.where(pd.notnull(df), None) returns a new DataFrame 替换,因此该行是无操作的。使用inplace=True 时,操作将就位,但这会将dtype 更改为对象。

标签: python pandas sqlalchemy null sql-insert


【解决方案1】:

嗯,Pandas 有自己漂亮的 DataFrame.to_sql() 方法,它会自动处理 NaN --> NULL 转换:

df.to_sql('tab_name', sql_alchemy_conn, if_exists='append', index=False)

如果您的 DF 有字符串 (object) 列,请使用 dtype 参数 (see an example in this answer)

【讨论】:

  • 谢谢马克斯。我之前使用过 to_sql,但后来由于性能问题不得不从 SQLAlchemy 切换到 CORE insert。我们甚至在 to_sql 上尝试了一段时间的调优/搜索选项,但它没有翻译。
  • @VarunKhanna,你用的是什么数据库?
  • 我正在连接到 Oracle 数据库
  • @VarunKhanna,您检查链接的答案了吗?它解决了字符串 Pandas 列在 Oracle 端转换为 CLOB 时的问题,这会导致巨大的性能问题......
  • 是的。我检查了 CLOBS 没有被存储。表格上的描述显示字符串被存储为字符串
猜你喜欢
  • 2023-01-20
  • 2023-03-04
  • 1970-01-01
  • 2018-09-24
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2018-05-19
相关资源
最近更新 更多