【问题标题】:How to prevent original pandas dataframe changing its value while being referenced in a class object?如何防止原始熊猫数据框在类对象中被引用时更改其值?
【发布时间】:2019-01-29 19:52:10
【问题描述】:

这是我对 Python 类的期望。我有一个具有特定值的变量num。类实例x 最初调用它,然后类使用函数add_one 更改其self.num 值。 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,所以当我通过add_new_col 更改obj_df 时,它还更改了df_test。我想要的是df_test 不添加NEW_COL

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

    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)

# Output
   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  NEW_COL
0     1     3      100
1     2     4      100
2     3     5      100
3     4     6      100
4     5     7      100

【问题讨论】:

    标签: python-3.x pandas class object


    【解决方案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
    

    【讨论】:

    • 我会试试的。但是您介意详细说明幕后的内容吗,为什么在处理数据帧时需要指定副本而与其他类型的变量不同?
    • 不只是 Pandas 数据帧,如果您使用普通的 python 列表运行实验,您会看到相同的行为。这是因为数据框和列表在 python 中是可变的(可以更改)对象,而像 int 或字符串这样的变量是不可变的(创建后无法更改)对象。这是一篇不错的中等帖子,应该更深入地解释:medium.com/@meghamohan/…
    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2017-03-18
    • 2014-04-11
    • 2023-03-13
    • 2018-02-20
    • 2017-05-18
    相关资源
    最近更新 更多