Pandas使用哪种Python Magic方法?

时间:2018-01-02 03:48:17

标签: python pandas getter-setter

我有一个包含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 不是设置,它是。

这里发生了什么?我的实际情况要复杂得多,但我相信这对我来说是根本的困惑。

感谢您帮我解决此问题。

2 个答案:

答案 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) 相关联的对象。因此,您的代码 获取 数据框,然后进行修改。