我有一个包含熊猫数据帧的类(self.my\u数据框),并更新self.my\u数据框没有我预期的效果。下面是代码的简化版本,说明了我的问题:
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。你知道吗
这里发生了什么?我的真实情况要复杂得多,但我相信这是我困惑的根源。你知道吗
谢谢你帮我弄清楚这件事。你知道吗
如果你把台阶拆了,就更容易看到发生了什么。而不是
考虑
这两个片段获得相同的结果。不会调用setter,因为您没有分配给
my_obj
对象的my_df
属性。您正在检索self.my_df
(这是一个数据帧)的内容,然后对其进行操作。你知道吗my_obj
对象只保存对DataFrame
的引用,因此除非将my_df
指向其他对象,否则不会调用setter。在您的代码中,my_obj
对象仍然指向相同的数据帧,但是您已经操纵了数据帧的内容。你知道吗如果/当您设置
self.my_df
时,将调用setter。你知道吗也就是说,如果你做了
self.my_df = 2
,那就是setter被调用的时候。你知道吗您要做的是修改与
self.my_df
关联的对象。所以你的代码就是获取数据帧,然后修改它。你知道吗相关问题 更多 >
编程相关推荐