【问题标题】:Observer for pandas dataframe熊猫数据框的观察者
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多