酸洗 Pandas 个包含元数据的 DataFrames 子类
Pickling Pandas DataFrames subclasses which include metadata
关于将元数据附加到 Pandas 对象并使该数据在 pickle/unpickle 过程中存活的问题是一个长期存在的问题。我看到一些非常古老的答案,基本上说你不能。希望这个问题的最新答案是肯定的。我正在使用 Pandas 0.23.3.
我制作了一些 Pandas DataFrame 子classes。我想我知道如何正确地做到这一点。我有一个 _constructor
方法,我的 __init__
方法可以处理 BlockManager
个对象。当我创建元数据属性时,我抑制了 UserWarning 警告我没有在 DataFrame 本身中创建列,在我的情况下这很好。
当我想将 DataFrame 保存到磁盘时,我调用 my_fancy_df.to_pickle(file_path)
。当我想重新加载它时,我使用 my_fancy_df = pandas.read_pickle(file_path)
。 MY 元数据被删除。 Pandas 本身具有元数据,可以很好地进行 pickle 和 unpickles,例如 DataFrame.name
属性。我想为我的属性复制此行为。
我可以在我的子 class 中拦截 .to_pickle
调用,并安排将元数据分别写入同一个文件对象。但我没有看到用于更改数据重新加载方式的等效方法。 read_pickle 函数是通用的,位于 Pandas 命名空间中,它不属于 DataFrame class.
我可能会编写一个自定义的 unpickling 函数,在我的 class 外部并使用它……这看起来很笨拙。如果有一个优雅的方法来完成这项工作,我还没有找到它。
我也没有死心塌地地使用 pickle。如果HDF5更合适,比如我可以切换。不过,我确实需要在 DataFrame 中挑选任意 Python 数据类型。单元格中的内容不仅仅是字符串和数字,我还有元组,在我构建的一个子class中,我什至将 DataFrames 放在 DataFrames 中。
感谢您的建议。
user "root" 的评论很有帮助。我已经确认,如果您在自定义 DataFrame subclass 中定义一个名为 _metadata 的 class 属性,它就是您希望通过切片、酸洗和解酸洗保留的实例属性的列表操作。
关于将元数据附加到 Pandas 对象并使该数据在 pickle/unpickle 过程中存活的问题是一个长期存在的问题。我看到一些非常古老的答案,基本上说你不能。希望这个问题的最新答案是肯定的。我正在使用 Pandas 0.23.3.
我制作了一些 Pandas DataFrame 子classes。我想我知道如何正确地做到这一点。我有一个 _constructor
方法,我的 __init__
方法可以处理 BlockManager
个对象。当我创建元数据属性时,我抑制了 UserWarning 警告我没有在 DataFrame 本身中创建列,在我的情况下这很好。
当我想将 DataFrame 保存到磁盘时,我调用 my_fancy_df.to_pickle(file_path)
。当我想重新加载它时,我使用 my_fancy_df = pandas.read_pickle(file_path)
。 MY 元数据被删除。 Pandas 本身具有元数据,可以很好地进行 pickle 和 unpickles,例如 DataFrame.name
属性。我想为我的属性复制此行为。
我可以在我的子 class 中拦截 .to_pickle
调用,并安排将元数据分别写入同一个文件对象。但我没有看到用于更改数据重新加载方式的等效方法。 read_pickle 函数是通用的,位于 Pandas 命名空间中,它不属于 DataFrame class.
我可能会编写一个自定义的 unpickling 函数,在我的 class 外部并使用它……这看起来很笨拙。如果有一个优雅的方法来完成这项工作,我还没有找到它。
我也没有死心塌地地使用 pickle。如果HDF5更合适,比如我可以切换。不过,我确实需要在 DataFrame 中挑选任意 Python 数据类型。单元格中的内容不仅仅是字符串和数字,我还有元组,在我构建的一个子class中,我什至将 DataFrames 放在 DataFrames 中。
感谢您的建议。
user "root" 的评论很有帮助。我已经确认,如果您在自定义 DataFrame subclass 中定义一个名为 _metadata 的 class 属性,它就是您希望通过切片、酸洗和解酸洗保留的实例属性的列表操作。