2016-05-29 3 views
1

Это фрагмент моего кода в Python. Этот код отлично меняет dataframe X_real_zeros, но он также меняет X, почему это происходит?Python лямбда-функция с 2-мя кадрами данных

X_real_zeros = X 
for column in numeric_cols: 
    X_real_zeros[column] = X[column].apply(lambda x: 0 if np.isnan(x) == 1 else x) 

Если я применяю что-то вроде этого:

X['columnii'] = X[column].apply(lambda x: 0 if np.isnan(x) == 1 else x) 

Это не изменит X [столбец] в начальной dataframe X.

+0

Спасибо всем! Это действительно работает. –

ответ

1

Когда вы X_real_zeros = X не создают копию X, называемую X_real_zeros, вы создаете новое связывание с вашим фреймворком данных X_real_zeros, то есть X и X_real_zeros указывают на то же пространство в памяти. Он работает так же, как со списками или dict, решение заключается в использовании явной копии.

X_real_zeros = X.copy() 
2

Проблема с этой линией X_real_zeros = X, вместо того, чтобы просто назначить вам следует использовать:

X_real_zeros = X.copy() 

Вы можете обратиться к why should I make a copy of a data frame in pandas для получения дополнительной информации.

0

При назначении

X_real_zeros = X 

X_real_zeros в настоящее время присваивается внутренний ссылку на объект X. Так, как X_real_zeros получает мутировал, X также изменяет значения. Чтобы безопасно копировать переменные, сделайте следующее:

X.copy() 

Это создаст новую копию X, и вы будете иметь возможность безопасно изменить X_real_zeros.