You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Python中继承pd.Series的自定义类序列化丢失数据问题?

解决继承pd.Series自定义类序列化后属性丢失的问题

问题原因

pandas的Series、DataFrame等核心对象在序列化时,只会默认保存自身的核心数据结构(如值、索引等),不会自动处理用户添加的自定义属性,导致反序列化后这些属性丢失。

方案1:重写__getstate__和__setstate__方法

通过重写这两个方法,将自定义属性加入序列化的状态字典,反序列化时再恢复这些属性。

修改后的代码:

import pickle
import dill
import pandas as pd
import numpy as np

class C(pd.Series):
    def __init__(self, value: str, *args, **kwargs):
        super().__init__(*args, **kwargs, dtype=np.float64)
        self.value = value

    @property
    def value(self):
        try:
            return self._value
        except AttributeError:
            self._value = None
            return self._value

    @value.setter
    def value(self, value: str):
        self._value = value

    # 自定义序列化状态,加入自定义属性
    def __getstate__(self):
        state = super().__getstate__()
        state['_value'] = self._value
        return state

    # 自定义反序列化状态,恢复自定义属性
    def __setstate__(self, state):
        super().__setstate__(state)
        self._value = state['_value']


c1 = C(data=[0], index=[0], value=1)

c2 = pickle.loads(pickle.dumps(c1))
print(c1.value)  # 输出1
print(c2.value)  # 输出1

c2 = dill.loads(dill.dumps(c1))
print(c1.value)  # 输出1
print(c2.value)  # 输出1

方案2:利用pandas的_metadata属性

pandas为自定义子类提供了_metadata类属性,用来声明需要被自动序列化的自定义元数据,无需手动处理状态方法。

修改后的代码:

import pickle
import dill
import pandas as pd
import numpy as np

class C(pd.Series):
    # 声明需要序列化的自定义属性名称
    _metadata = ['_value']

    def __init__(self, value: str, *args, **kwargs):
        super().__init__(*args, **kwargs, dtype=np.float64)
        self.value = value

    @property
    def value(self):
        try:
            return self._value
        except AttributeError:
            self._value = None
            return self._value

    @value.setter
    def value(self, value: str):
        self._value = value


c1 = C(data=[0], index=[0], value=1)

c2 = pickle.loads(pickle.dumps(c1))
print(c1.value)  # 输出1
print(c2.value)  # 输出1

c2 = dill.loads(dill.dumps(c1))
print(c1.value)  # 输出1
print(c2.value)  # 输出1

内容的提问来源于stack exchange,提问作者Mary.A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:30:15