Как связь между локальными и глобальными фреймами данных в Python? - PullRequest
0 голосов
/ 08 июля 2019

Я изменяю фрейм данных внутри функции, но не хочу, чтобы он менял глобальную переменную.

Я использую два разных способа изменить мой фрейм данных, и они по-разному влияют на мою глобальную переменную.Первый метод добавления нового столбца путем назначения несуществующего столбца изменяет глобальный фрейм данных.При конкатенации нового столбца глобальный фрейм данных остается неизменным.

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
            columns=['a', 'b', 'c'])
def mutation(data):
     data['d'] = [1, 2, 3]
mutation(df)
print(df)
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
            columns=['a', 'b', 'c'])
def mutation(data):
    data = pd.concat([data,pd.DataFrame([1,2,3], columns=['d'])], axis =1)
mutation(df)
print(df)

Я ожидаю, что когда я печатаю df после вызова функции, я вижу столбцы a, b и c.Но первый метод также показывает столбец d.

1 Ответ

1 голос
/ 08 июля 2019

Когда вы передаете объект data в функцию, вы фактически передаете его ссылку на функцию.Поэтому, когда вы выполняете мутации на месте объекта, на который он указывает, вы можете видеть эти мутации также и вне функции.

Если вы хотите сохранить исходные данные в неизменном виде, передайте клонисходный фрейм данных выглядит следующим образом:

df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
            columns=['a', 'b', 'c'])
def mutation(data):
     data['d'] = [1, 2, 3]
mutation(df.copy())
print(df) 

Вывод:

   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9  

Функция работает с клоном, поэтому исходный фрейм данных остается неизменным.

Второй пример, который вы сделали, не является операцией на месте исходного фрейма данных: вместо этого он создает новый фрейм данных.Таким образом, во втором примере ваш исходный DF не изменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...