我有一个包含pandas DataFrame(self.my_df)的类,并且更新self.my_df并不像我期望的那样。这是代码的简化版本,用于说明我的问题:
class my_obj(object):
@property
def my_df(self):
if not hasattr(self, "_my_df"):
self._my_df = pandas.DataFrame({ "A" : [1,2,3,],
"B" : [4,5,6]}).fillna("")
print("Retrieving!")
return self._my_df
@my_df.setter
def my_df(self, my_new_df):
print("Setting!")
self._my_df = my_new_df.copy()
这是当我(尝试)调用这些方法时发生的事情(来自我认为不重要的单独实例方法):
ipdb> self.my_df
Retrieving!
A B
0 1 4
1 2 5
2 3 6
ipdb> self.my_df.loc[2, "B"] = "x"
Retrieving!
ipdb> self.my_df
Retrieving!
A B
0 1 4
1 2 5
2 3 x
ipdb> self._my_df
A B
0 1 4
1 2 5
2 3 x
我希望self.my_df.loc[2, "B"] = "x"
能够调用setter,它不会,或者 - 如果它不 - 那么我希望self._my_df 不是设置,它是。
这里发生了什么?我的实际情况要复杂得多,但我相信这对我来说是根本的困惑。
感谢您帮我解决此问题。
答案 0 :(得分:0)
如果您分解步骤,可以更容易地看到发生了什么。而不是
temp = self.my_df # Clearly this should call the get method
temp.loc[2, "B"] = "x" # Changes the pandas object
考虑
my_df
这两个片段实现了相同的结果。不会调用setter,因为您没有分配my_obj
对象的self.my_df
属性。您正在检索my_obj
(这是一个数据帧)的内容,然后对其进行操作。
DataFrame
对象只保存对my_df
的引用,因此除非您将my_obj
指向其他对象,否则不会调用该setter。使用您的代码,**Installation failed: cannot change working directory**
对象仍指向相同的数据框,但您已操纵数据框的内容。
答案 1 :(得分:0)
如果/当 设置 self.my_df
时,将调用setter。
即。如果你在调用setter的时候self.my_df = 2
做了self.my_df
。
您正在做的是修改与DateTime.now.to_s(:db)
相关联的对象。因此,您的代码 获取 数据框,然后进行修改。