【发布时间】:2020-11-16 11:58:11
【问题描述】:
我正在尝试为 DataFrame 创建一个观察者。我创建了一个具有数据框作为实例属性的类。在这个类中,我使用 setter 装饰器创建了一个观察者,但是当我修改或添加单个列时,不会调用 setter。
班级是这样的
class ProvenanceTracker:
def __init__(self, initial_df):
self._df = initial_df
self._copy_df=initial_df.copy()
self.shape_change = False
self.value_change = False
def dataframe_is_changed(self):
if self._df.shape==self._copy_df.shape:
if not self._df.equals(self._copy_df):
print('difference founded')
self.value_change = True
else:
print('same df')
pass
else:
print('shape changed detected')
self.shape_change = True
@property
def df(self):
return self._df
@df.setter
def df(self, new_value):
self._df = new_value
self.dataframe_is_changed()
if self.shape_change:
##Do something
self._copy_df=self._df.copy()
self.shape_change = False
elif self.value_change:
##Do something
self._copy_df=self._df.copy()
self.value_change = False
一个例子:
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
tracker=ProvenanceTracker(df)
如果我尝试添加新列或修改列,则不会调用 setter 方法
tracker.df['test']=np.zeros(tracker.df.shape[0])
如果我对所有 df 进行操作,则调用 setter
tracker.df = tracker.df.replace(2, 5)
有没有办法在每次df改变时调用方法?
【问题讨论】:
标签: python python-3.x pandas python-2.7 dataframe