pandas 数据框的观察者

Observer for pandas dataframe

我正在尝试为 DataFrame 创建观察者。我创建了一个 class,它有一个数据框作为实例属性。在此 class 中,我使用 setter 装饰器创建了一个观察者,但是当我修改或添加单个列时,不会调用 setter。

class是这样的

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 吗?

如果您可以忍受由于委托继承自数据框并在您的代码中使用子项 class 而导致的性能下降至少可以解决问题。