0

我正在尝试向 pandas 添加一种方法,以便在可以访问数据框的情况下轻松使用它。然而,序列化“杀死”了以下示例所示的方法

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)您知道如何在数据帧上序列化添加的方法吗?

谢谢

4

1 回答 1

2

1)你看到是什么导致了问题吗?

您需要将方法添加到类而不是实例中

df = pd.DataFrame([0,1])
@addto(pd.DataFrame)
def saygoodbye(self):
    print("goodbye")

2)您知道如何在数据帧上序列化添加的方法吗?

如果我理解正确,您希望将数据帧实例序列化为 pickle 文件,然后再将其反序列化。我的建议是创建一个继承自 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()
于 2016-10-11T14:56:12.970 回答