熊猫数据帧的观察者



我正在尝试为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更改时调用一个方法?

我自己从未尝试过,但你不能实现__set_item__()并委托给https://github.com/pandas-dev/pandas/blob/67a3d4241ab84419856b84fc3ebc9abcbe66c6b3/pandas/core/frame.py#L3028?

如果您能够忍受由于从数据帧继承的委派和在代码中使用子类而导致的性能降低,那么至少可以解决这个问题。

最新更新