2016-10-11 5 views
0

팬더에 메서드를 추가하려고하므로 데이터 프레임에 액세스 할 수 있으면 쉽게 사용할 수 있습니다. 나에게 던져 다음 예팬더가 메서드를 추가해도 직렬화가 지속되지 않습니다

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

1) 무엇이 문제를 일으키는 지 봅니까?

당신은 클래스 대신

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

2) 방법 dataframe에 추가 방법을 직렬화하는 어떤 생각을 가지고 있습니까 같은 인스턴스에 메소드를 추가 할 필요가?

올바르게 이해했다면, 데이터 프레임 인스턴스를 피클 파일로 직렬화 한 다음 나중에 비 직렬화 할 수 있습니다. 제안 사항은 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() 
+0

이것을 구현하는 데 데코레이터를 사용할 방법이 있습니까? 많은 데이터 프레임에 많은 함수가 있다고 가정하면 각 데이터 프레임에 대한 맞춤 클래스를 만드는 것이 복잡해 보입니다. – Damlatien

+0

클래스 데코레이터와 같은 것이 있습니다 ... –

+0

@MikeMcKerns Aww. 그것은 굉장. 가르쳐 줘서 고마워! – Peng