Python Pandas 使用的是哪种魔法?

Which Python Magic Method is Pandas Using?

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

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

感谢您帮我解决这个问题。

如果分解这些步骤,就更容易看出发生了什么。而不是

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 对象仍然指向同一个数据框,但您已经操纵了数据框的内容。

setter会叫if/when你setself.my_df.

即如果你做了 self.my_df = 2 那就是 setter 会被调用的时候。

您正在做的是修改与 self.my_df 关联的对象。所以你的代码是获取数据框,然后修改它。