【问题标题】:How to handle and manipulate large IDs with pandas?如何使用 pandas 处理和操作大 ID?
【发布时间】:2022-02-10 17:46:38
【问题描述】:

我目前正在处理一个数据库表,该表的主键 ID 最多为 28 位。 对于我的用例,我需要操作此表中的一些数据点(包括 ID)并将其写回 db 表。

现在,对于 ID,我需要将其递增 1,而我正在努力使用 pandas 和 windows 来实现这一点。 不幸的是,很明显,我无法读取 ID 并将其保存为数据框中的纯整数。 事先将其转换为 np.float64 似乎完全弄乱了这些值。

例如: 我正在使用 ID 2021051800100770010113340000 操作数据点 如果我通过显式提供此列的 dtype 将 ID 列转换为 np.float64, ID 变为2021051800100769903675441152.0,这似乎是一个完全不同的数字。 另外我不知道将 ID 列增加 1 是否有效,因为结果将与上面的数字相同。

有没有办法以适当的方式解决这个问题?我的最后一个选择是将其转换为字符串,然后更改该字符串的最后一个子字符串。但我觉得这不是一个好的和干净的解决方案。更不用说我不确定我是否可以以那种形式将它写回数据库。

编辑//

基于此建议 (https://stackoverflow.com/a/21591439/3856569) 我通过以下方式编辑了 ID 列: df["ID"] = df["ID"].apply(int)

然后增加数字。

我得到以下结果:

2021051800100769903675441152
2021051800100769903675441153

所以增量现在似乎起作用了,但我仍然看到与我最初得到的完全不同的数字。

【问题讨论】:

  • 那你为什么要把你的ID转换成float呢?只需使用int。对于绝对可靠的值,浮点数并不是一个好主意。
  • 在我知道我在编辑中发布的选项之前,转换为 float 是我将自动检测到的 Object dtype 转换为我可以递增的 dtype 的唯一方法ID。

标签: python pandas


【解决方案1】:

请和我一起从另一个角度来看这个问题。如果我们能够理解 ID 是如何形成的,我们或许能够以不同的方式处理它,例如,前 8 位数字看起来像一个日期,如果这是真的,那么您的任何操作都不应该修改这 8 位数字,除非您的意图是更改日期。在这种情况下,您可以将您的 ID(在 str 中)分成 2 部分。

20210518/00100770010113340000

那么现在我们只需要处理对于np.int64 来说仍然太大的第二部分。不过,如果你弄清楚它是如何形成的,那么或许你可以进一步将它分离出来,最终处理一个可以被np.int64处理的数字。

例如,ID会以这种方式形成吗? 20210518 / 001 / 007 / 7001011334 / 0000

如果我们可以将其拆分为意义的片段,那么我们就知道在操作时需要保留哪一部分(在您的情况下加 1)

【讨论】:

  • 这看起来很合理!
  • 我明白你的想法。如果没有其他选择,我会尝试获取该信息。无论如何,您将如何继续拆分数字以便将它们保存为整数?将其读取为字符串,然后通过 substring 方法拆分字符串并将结果转换为 int?
  • 是的,将其读取为字符串,使用子字符串将其拆分,例如[x:y],只将我需要的部分转换为整数,然后加1,将其转换回字符串,并将所有部分连接回一个字符串。
  • 抱歉回复晚了。但我了解了 ID 的确切结构,并完全按照您的建议进行操作。非常感谢您的支持!
  • 感谢您的更新!很高兴听到这个消息!
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 2022-11-02
  • 2017-05-04
  • 2014-07-02
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多