I have an object called Data, which has a pandas DataFrame (df) as an attribute. What I want to do is trigger an action on the change of that df. Specifically, the addition of a new column.
Right now I have it working by re-setting the attribute, but it doesn't catch any changes to its attributes. Here is an example:
class Data:
def __init__(self, df: Optional[DataFrame] = None) -> None:
self.sets = 0
self.updates = 0
self._df = df if df is not None else pd.DataFrame
@property
def df(self) -> DataFrame:
return self._df
@df.setter
def df(self, new_df: DataFrame) -> None:
if self._df.empty:
self.sets += 1
# do something...
else:
self.updates += 1
# do somthing else...
self._df = new_df.copy(deep=True)
Behavior
Init
d = Data()
# d.sets == 0
# d.updates == 0
Set df
d.df = pd.DataFrame({
'a': [1, 1, 1],
'b': [2, 2, 2],
})
# d.sets == 1
# d.updates == 0
Update df
d.df = pd.DataFrame({
'a': [1, 1, 1],
'b': [2, 2, 2],
'c': [3, 3, 3],
})
# d.sets == 1
# d.updates == 1
Add New Column (NOT WORKING)
d.df['d'] = [4, 4, 4]
# d.sets == 1
# d.updates == 1 (EXPECTED 2)