如何避免在类对象中引用原始熊猫数据框时更改其值?

时间:2019-01-29 19:52:10

标签: python-3.x pandas class object

这是我对Python类的期望。我有一个具有特定值的变量num。类实例x首先调用它,然后该类通过函数self.num更改其add_one值。 num保留其原始值。

class Test_Class:
    def __init__(self, num):
        self.num = num

    def show(self):
        return self.num

    def add_one(self):
        self.num = self.num+1

num = 50
x = Test_Class(num)
x.add_one()
print (x.show())
print (num)

# Output
# 51
# 50

但是出于某些奇怪的原因,我对Pandas数据框使用了相同的逻辑,但是好像obj.df直接链接到原始df_test,所以当我更改{{1} }通过obj_df,它也会更改add_new_col。我想要的是让df_test不添加df_test

NEW_COL

1 个答案:

答案 0 :(得分:1)

在您的类的__init__方法中,使用行self.df = df.copy()self.df初始化为原始数据帧的副本。如果我们修改您给出的示例,则输出如下:

df_test = pd.DataFrame({'Col1':[1, 2, 3, 4, 5], 'Col2':[3, 4, 5, 6, 7]})

class Test_Class:
    def __init__(self, df):
        self.df = df.copy()

    def add_new_col(self, df, column_name): # this function requires a df as parameter
        df[column_name] = 100

obj = Test_Class(df_test)
obj.add_new_col(obj.df, 'NEW_COL')

print (obj.df)
print (df_test)

   Col1  Col2  NEW_COL
0     1     3      100
1     2     4      100
2     3     5      100
3     4     6      100
4     5     7      100

   Col1  Col2
0     1     3
1     2     4
2     3     5
3     4     6
4     5     7