Pandas使用哪种Python魔术方法?

2024-10-06 13:58:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含熊猫数据帧的类(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。你知道吗

这里发生了什么?我的真实情况要复杂得多,但我相信这是我困惑的根源。你知道吗

谢谢你帮我弄清楚这件事。你知道吗


Tags: 数据方法代码self版本dfnewmy
2条回答

如果你把台阶拆了,就更容易看到发生了什么。而不是

self.my_df.loc[2, "B"] = "x"

考虑

temp = self.my_df         # Clearly this should call the get method
temp.loc[2, "B"] = "x"    # Changes the pandas object

这两个片段获得相同的结果。不会调用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关联的对象。所以你的代码就是获取数据帧,然后修改它。你知道吗

相关问题 更多 >