2016-01-21 5 views
0

У меня есть класс, который имеет атрибут, который является фреймворком pandas. Я хотел бы определить другой атрибут в том же классе, который изменяется при изменении данных. Я думал, что сеттер может быть правильным, но я не смог заставить его работать. Вот это игрушка пример:установить атрибут при изменении атрибута в python

import pandas as pd 

class Foo(object): 
    def __init__(self, df=None): 
     self._df = df 
     self.altered = False # bool, set to True if self._df changes 
    @property 
    def df(self): 
     return self._df 
    @df.setter 
    def df(self, df): 
     self.altered = True # since _df might change here set self.altered True 
     self._df = df 

df_test = pd.DataFrame([[1,2,3]], columns=['a','b','c']) 
cl = Foo(df_test) 
cl.df.loc[0, 'a'] = 3 # change a default value in dataframe 
print(cl.df) 
print(cl.altered) 

который печатает измененную dataframe но cl.altered по-прежнему установлен в значение False.

Любые предложения?

ответ

3

Я действительно мало знаю о пандах. Но сеттер не называется, так как линия была:

cl.df.loc[0, 'a'] = 3 

Это назвали бы, если линия была:

cl.df = 3 

Одна вещь, которую вы можете сделать, это сохранить копию оригинального df когда экземпляр инициализируется и сделать что-то вроде:

@property 
def altered(self): 
    return self._orig_df == self._current_df 
+0

Хорошее предложение, единственная проблема заключается в том, что экземпляры класса будет занимать в два раза больше памяти, это может быть проблематично, как datafram может быть довольно большим. – derchambers

Смежные вопросы