如何解决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
相关产品推荐
相关产品推荐

