【问题标题】:Pandas read_sql changing large number IDs when readingPandas read_sql 在读取时更改大量 ID
【发布时间】:2020-11-20 20:05:03
【问题描述】:

我将一个 Oracle 数据库转移到了 SQL Server,一切似乎都很顺利。各种 ID 列都是很大的数字,所以我不得不使用 Decimal,因为它们对于 BigInt 来说太大了。

我现在尝试使用 pandas.read_sql 读取数据,使用 pyodbc 连接与 ODBC Driver 17 for SQL Server。 df = pandas.read_sql("SELECT * FROM table1"),con)

这些数字以 float64 形式出现,当我尝试打印它们时,我们在 SQL 语句中使用它们,它们以科学计数法出现,当我尝试使用 '{:.0f}'.format(df.loc[i,'Id']) 时,它将几个数字变成相同的数字,例如 90300111000003078520832。就像使用科学记数法时会丢失精度一样。

我也在 read_sql 之前尝试了pd.options.display.float_format = '{:.0f}'.format,但这没有帮助。

显然我做错了什么,因为数据库中的 ID 是正确的。

感谢任何帮助谢谢

【问题讨论】:

  • 尝试将, coerce_float=False 添加到您的read_sql 通话中。这应该将列值作为Decimal 对象返回。
  • 你从哪里想出这些东西的……照常工作,谢谢你的帮助;)
  • @Pearl 在read_sql 文档中。

标签: sql-server pandas dataframe pyodbc


【解决方案1】:

pandas 的 read_sql 方法有一个名为 coerce_float 的选项,默认为 True 并且它......

尝试将非字符串、非数字对象(如 decimal.Decimal)的值转换为浮点数,这对 SQL 结果集很有用。

但是,在您的情况下,它没有有用,因此只需指定coerce_float=False

【讨论】:

  • 这适用于 SQL Server,但是当我在 Oracle 中尝试此操作时,数字仍然会浮动,但仅在某些列上,并且似乎只有当数字大于一定数量时。具有集合 90100111000003066499263 的 IE 列转到对象,但具有集合 95800111000002629236975 的列转到浮动,因此是科学记数法。两者都是 Oracle 中的 Number(25,0)。有什么想法吗?
  • @Pearl - 我无法重现您的问题。 This code 对我来说很好。
  • 所以很奇怪的是那些导致问题的 ID 是另一个表中的主 ID,当我拉那个表时没有问题。我还尝试从其他几个表中提取 ID,没有任何问题。此列中有空值,但是我检查了其他带有空值的 ID 字段,它们工作正常知道如何诊断这个问题,因为我不确定从这里去哪里?
  • 您是在实际表还是视图(可能涉及多个表)上运行 SELECT?
  • 我对数据库的访问权限有限,但它位于我的用户下的表选项卡中,而不是在 SQL Developer 中查看。另一个奇怪的事情是,我是否使用 coerse_float=False 都没有关系,所有 ID 都保持相同的格式,即除了这两列之外的所有对象
【解决方案2】:

我也遇到过这个问题,尤其是使用长 ID:read_sql 对主键有效,但不适用于其他列(例如来自 Twitter API 调用的retweeted_status_id)。将 coerce_float 设置为 false 对我没有任何帮助,因此我将 retweeted_status_id 转换为我的 sql 查询中的字符格式。

使用 psql,我会这样做:

df = pandas.read_sql("SELECT *, Id::text FROM table1"),con)

但在 SQL Server 中会是这样的

df = pandas.read_sql("SELECT *, CONVERT(text, Id) FROM table1"),con)

df = pandas.read_sql("SELECT *, CAST(Id AS varchar) FROM table1"),con)

如果您要求转换很多行,显然这里会产生成本,更有效的选择可能是从 SQL Server 中提取而不使用 pandas(作为嵌套列表或 JSON 或其他东西),这也将保留您的长整数格式。

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 2017-06-06
    • 2020-11-23
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多