ModuleNotFoundError:使用 Metaflow 时没有名为“pandas.core.indexes.numeric”的模块

cry*_*ick 30 python pickle pandas netflix-metaflow

我使用 Metaflow 加载数据框。它已成功从工件存储中取消腌制,但当我尝试使用 查看其索引时df.index,收到一条错误消息ModuleNotFoundError: No module named 'pandas.core.indexes.numeric': 。为什么?

我在这里这里查看了具有类似错误消息的其他答案,这些答案说这是由于尝试使用旧版本的 Pandas 来取消数据帧引起的。然而,我的错误略有不同,并且不能通过升级 Pandas ( pip install pandas -U) 来修复。

cry*_*ick 36

这个问题是由新的Pandas 2.0.0 版本破坏了与 Pandas 1.x 的向后兼容性引起的,尽管我没有在发行说明中看到这一点。解决方案是将pandas降级到1.x系列:pip install "pandas<2.0.0"

  • (当然,腌制的 Dataframe 很可能包含对此类私有/内部 Pandas 模块的引用,因为它们很可能用于创建 Dataframe。) (4认同)
  • “尽管我没有在发行说明中看到这一点。” 那是因为它一开始就不应该被使用。请参阅 [API 参考](https://pandas.pydata.org/pandas-docs/stable/reference/index.html) 文档的顶层:“pandas.core、pandas.compat 和 pandas.util top-级别模块是私有的。无法保证此类模块的稳定功能。” 您应该将此报告为针对元流的错误。 (2认同)
  • 可能“正确”的方法是将 DataFrame 扩展到各种类,如 HDF5SafeDataFrame、JSONSafeDataFrame 等,但是如果您希望这些派生类与期望的第三方代码正确地进行互操作,这可能需要相当多的额外工作一个普通的数据框?嗯是的。我认为有一个非常有力的论据表明,在某些情况下,Pickle *是*正确的设计选择。它有缺点,但有时替代方案更糟糕。 (2认同)

Mik*_*e T 33

尝试使用该pandas.read_pickle()方法来加载文件而不是pickle模块:

import pandas as pd

df = pd.read_pickle("file.pkl")
Run Code Online (Sandbox Code Playgroud)

pandas 方法应该提供读取旧文件的兼容性,并且“仅保证向后兼容 pandas 0.20.3,前提是该对象是使用 to_pickle 序列化的。” 我对 pandas-1.x 的测试表明它也可以读取从pickle模块写入的一些文件。