【问题标题】:Storing MongoDB ObjectID's in Pandas在 Pandas 中存储 MongoDB ObjectID
【发布时间】:2020-06-24 05:25:34
【问题描述】:

从 MongoDB 检索数据并加载到 Pandas 数据帧后,关于存储十六进制 ObjectID 的推荐做法是什么?

我认为,存储为字符串时,它们会占用大量内存,这在非常大的数据集中可能会受到限制。将它们转换为整数(从十六进制到十进制)是个好主意吗?这不会减少内存使用并加快处理速度(合并、查找...)吗?

顺便说一句,这就是我的做法。这是最好的方法吗?不幸的是,NaN 失败了。

tank_hist['id'] = pd.to_numeric(tank_hist['id'].apply(lambda x: int(str(x), base=16)))

【问题讨论】:

  • 您的身份证件有多长?整数有大小限制。
  • 你能提供更多的上下文信息吗?这真的取决于你的设置。如果您只想摆脱十六进制值,请使用 tank_hist['id'].to_csv(...) tank_hist.drop('id', axis=1)。然后,如果需要,您可以在 csv 文件中进行映射。不要使用应用。它的计算成本很高。仅仅为了节省一些内存使用而使用 apply 并不是一件好事。在任何情况下,可能十六进制值对您的内存使用都不是那么重要。

标签: python pandas mongodb bson


【解决方案1】:

首先,我认为它是 NaN,因为对象 ID 大于 64 位整数。 Python 可以处理,但底层的 pandas/numpy 可能不行。

我认为您想使用地图来提取一些有用的字段,以后可以对其进行多级排序。不过,我不确定您是否会看到预期的性能提升。

我将首先在您的框架中创建一个新系列“oid_*”并检查您的结果

https://docs.mongodb.com/manual/reference/method/ObjectId/

将对象 id 分解为组件:

  • 时间戳(4 字节),
  • 随机(5 个字节 - 曾经是主机标识符),并且
  • 计数器(3 个字节)

这些整数大小是 numpy 处理的好且合适的整数大小。

tank_hist['oid_timestamp'] = tank_hist['id'].map(lambda x: int(str(x)[:8], 16))
tank_hist['oid_random'] = tank_hist['id'].map(lambda x: int(str(x[:4])[8:18], 16))
tank_hist['oid_counter'] = tank_hist['id'].map(lambda x: int(str(x[:4])[18:], 16))

这将允许您对时间戳系列进行主要排序,对框架中的其他系列进行次要排序?然后在柜台上进行第三次排序。

地图是戳系列中每条记录的超级有用(尽管速度很慢)的方法。如果您在此处添加计算时间以换取稍后节省此计算时间,请意识到这一点。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.map.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多