import pandas as pd
class MyClass():
def __init__(self, df):
self.df = df
def edit(self):
self.df = self.df[~self.df['numbers'].isin([2,4,6,8,10])]
df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10], columns=['numbers'])
obj = MyClass(df).edit()
print df
我希望print df
能够打印在过滤功能之后重新分配的数据帧。
但是这个stil会打印出edit
函数修改它之前的数据帧。
我的外部变量如何仍然跟踪发生在类{<1}}内的更改
答案 0 :(得分:1)
我的外部变量如何仍然跟踪发生在类
中的df的更改
你试图这样做的方式,即通过重新分配,这是不可能的。名字不会“看到”其他名称的重新分配(如果他们这样做,可以想象灾难)。
这里唯一没有重新分配df
的机会是 mutate 数据帧。您目前所做的只是创建一个新对象并重新分配self.var
。你班级以外的var
并不关心这一点,仍然指向旧的对象。
当然,明智的做法是将df
重新分配给某些功能或方法的返回值,即:
def compute_new_df_from_old_df(df):
return df.foo()[bar]
df = <some dataframe>
df = compute_new_df_from_old_df(df)
答案 1 :(得分:1)
尝试将代码重写为:
df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10], columns=['numbers'])
obj = MyClass(df)
obj.edit()
print obj.df
答案 2 :(得分:0)
不可变对象不是通过引用传递的(在技术上,neither are mutable objects)。您有什么特别的理由要这样做吗?