Как предотвратить изменение исходного значения исходного кадра данных панд при обращении к нему в объекте класса? - PullRequest
0 голосов
/ 29 января 2019

Это то, что я ожидаю от класса 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, поэтому, когда я изменил obj_df через add_new_col, он также изменит 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

1 Ответ

0 голосов
/ 29 января 2019

В методе класса __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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...