Pandas 添加方法无法序列化
Pandas adding method does not survive serialization
我正在尝试向 pandas 添加一个方法,以便在我有权访问数据框时可以轻松使用它。然而序列化"kills"方法如下例所示
import dill
class Foo:
def sayhello(self):
print("hello")
f = Foo()
dill.dump(f, open("./foo.pickle", "wb"))
f1 = dill.load(open("./foo.pickle", "r"))
f1.sayhello()
def addto(instance):
def decorator(f):
import types
f = types.MethodType(f, instance, instance.__class__)
setattr(instance, f.func_name, f)
return f
return decorator
@addto(f)
def saygoodbye(self):
print("goodbye")
dill.dump(f, open("./foo.pickle", "wb"))
f1 = dill.load(open("./foo.pickle", "r"))
f1.sayhello()
f1.saygoodbye()
import pandas as pd
df = pd.DataFrame([0,1])
@addto(df)
def saygoodbye(self):
print("goodbye")
dill.dump(df, open("./dframe.pickle", "wb"))
df1 = dill.load(open("./dframe.pickle", "r"))
df1.saygoodbye()
这给我一个 AttributeError: 'DataFrame' object has no attribute 'saygoodbye'
1) 你知道是什么导致了问题吗?
2) 你知道如何在数据帧上序列化添加的方法吗?
谢谢
1) 你知道是什么导致了问题吗?
您需要将方法添加到 class 而不是像
这样的实例
df = pd.DataFrame([0,1])
@addto(pd.DataFrame)
def saygoodbye(self):
print("goodbye")
2) 你知道如何在数据帧上序列化添加的方法吗?
如果我没理解错的话,您想将数据帧实例序列化为泡菜文件,然后再反序列化。
我的建议是创建一个新的 class 继承自 DataFrame。
class MyDataFrame(pd.DataFrame):
def saygoodbye(self):
print 'saygoodbye'
df = MyDataFrame([0,1])
dill.dump(df, open("./dframe.pickle", "wb"))
df1 = dill.load(open("./dframe.pickle", "r"))
df.saygoodbye()
我正在尝试向 pandas 添加一个方法,以便在我有权访问数据框时可以轻松使用它。然而序列化"kills"方法如下例所示
import dill
class Foo:
def sayhello(self):
print("hello")
f = Foo()
dill.dump(f, open("./foo.pickle", "wb"))
f1 = dill.load(open("./foo.pickle", "r"))
f1.sayhello()
def addto(instance):
def decorator(f):
import types
f = types.MethodType(f, instance, instance.__class__)
setattr(instance, f.func_name, f)
return f
return decorator
@addto(f)
def saygoodbye(self):
print("goodbye")
dill.dump(f, open("./foo.pickle", "wb"))
f1 = dill.load(open("./foo.pickle", "r"))
f1.sayhello()
f1.saygoodbye()
import pandas as pd
df = pd.DataFrame([0,1])
@addto(df)
def saygoodbye(self):
print("goodbye")
dill.dump(df, open("./dframe.pickle", "wb"))
df1 = dill.load(open("./dframe.pickle", "r"))
df1.saygoodbye()
这给我一个 AttributeError: 'DataFrame' object has no attribute 'saygoodbye'
1) 你知道是什么导致了问题吗?
2) 你知道如何在数据帧上序列化添加的方法吗?
谢谢
1) 你知道是什么导致了问题吗?
您需要将方法添加到 class 而不是像
这样的实例df = pd.DataFrame([0,1])
@addto(pd.DataFrame)
def saygoodbye(self):
print("goodbye")
2) 你知道如何在数据帧上序列化添加的方法吗?
如果我没理解错的话,您想将数据帧实例序列化为泡菜文件,然后再反序列化。 我的建议是创建一个新的 class 继承自 DataFrame。
class MyDataFrame(pd.DataFrame):
def saygoodbye(self):
print 'saygoodbye'
df = MyDataFrame([0,1])
dill.dump(df, open("./dframe.pickle", "wb"))
df1 = dill.load(open("./dframe.pickle", "r"))
df.saygoodbye()