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
关联的对象。所以你的代码是获取数据框,然后修改它。
我有一个 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
关联的对象。所以你的代码是获取数据框,然后修改它。