Python 类增加了基础数据,但不应该这样做

Python 类增加了基础数据,但不应该这样做,python,dataframe,class,oop,Python,Dataframe,Class,Oop,我已经创建了一个类来扩展底层数据,但并不打算这样做。你能解释一下这种行为是从哪里来的以及如何预防吗 这里是MWE:MyClass接受一个数据帧,我想在前面添加一列数据帧,并将数据设置为属性。此更改仅在类中发生 class MyClass: def __init__(self, rhs): # Declare data self.rhs = MyClass._add_intercept(rhs) @staticmethod def _ad

我已经创建了一个类来扩展底层数据,但并不打算这样做。你能解释一下这种行为是从哪里来的以及如何预防吗

这里是MWE:MyClass接受一个数据帧,我想在前面添加一列数据帧,并将数据设置为属性。此更改仅在类中发生

class MyClass:
    def __init__(self, rhs):

        # Declare data
        self.rhs = MyClass._add_intercept(rhs)

    @staticmethod
    def _add_intercept(rhs):
        # Add ones to the front
        idxname = rhs.index.name
        rhs['A'] = 1
        rhs = rhs.reset_index().set_index('A').reset_index().set_index(idxname) 
        return rhs
当我创建一个只包含零的数据帧并将其传递给类并初始化该类时

rhs = pd.DataFrame(np.zeros((4,2)), columns=['B','C'])
rhs.index.name = 'position'
instance = MyClass(rhs)
print(rhs)
数据框现在包含一列不应该存在的1

     B    C  A
position             
0         0.0  0.0  1
1         0.0  0.0  1
2         0.0  0.0  1
3         0.0  0.0  1

那么,这背后是什么呢?

传递给类的对象仍然指向原始数据帧。在传递给类之前,或者在 AddioTopCopp> <代码>方法中,您应该考虑获取数据文件的副本。有关更多信息,请参阅pandas文档:

您需要制作数据帧的副本,而不是就地修改它。对于那些寻求更深入解释的人,视频帮助我理解了基本逻辑(由@lukas graf提供),而@TDeg的回答解决了问题。