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 而导致的性能下降至少可以解决问题。
我正在尝试为 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 而导致的性能下降至少可以解决问题。