asyaevloeva
@asyaevloeva

Почему переменная изменяет значение?

У меня есть такой код где я создаю датафрейм cotraiders и мне нужно чтобы этот датафрейм не менялся после использования функций, но проблема в том что он меняется и я не могу понять почему ?

import pandas as pd

def find_stats(df_segment):
    comtraders2 = df_segment
    company_segments = ['a', 'b']
    segments_ = [['a', 'c'], ['c', 'd'], ['b']]
    print('Case 1:', comtraders2)
    df_segment['segment'] = [len(set(company_segments) & set(str(segments_[i]).split('|'))) > 0 for i in range(len(segments_))]
    print('Case 2:', comtraders2)

    return df_segment.equals(comtraders2), df_segment

comtraders = pd.DataFrame()
comtraders['segment'] = [['a', 'c'], ['c', 'd'], ['b']]
print('Initial:', comtraders)
result, df_segment = find_stats(comtraders)

print('Result 1:', result)
print('Result 2:', df_segment.equals(comtraders))


В результате и comtraders и comtraders2 меняют свои значения, почему?

Скриншот фрагмента кода удалён модератором.
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Когда вы выбираете подсет фрейма и ИЗМЕНЯЕТЕ этот подсет то может меняться и сам фрейм из которого этот подсет был выбран. Это известная особенность pandas, причина которых лежит в numpy. Как поправить, для этого используют копию и уже от этой копии и берется подсет. В вашем коде comtraders2 = df_segment вот это строчку нужно заменить на comtraders2 = df_segment.copy() И тогда будет работать, как вы ожидаете.

помните подобные операции, могут приводить к изменению оригинального фрейма.
df = pd.DataFrame({
    'A':[1,2,3],
    'B':[4,5,6]
})

subset = df['A'] 
subset[0] = 100
print(df)

И вы увидите ваш оригинальный df изменился. Существует несколько кейсов, при определенных он выдаст предупреждение, при таком как я привел выше и вовсе все произойдет молча.
поправить также, использовать копию.
df = pd.DataFrame({
    'A':[1,2,3],
    'B':[4,5,6]
})

subset = df['A'].copy() 
subset[0] = 100
print(df)

Ну и немножко, не в тематику вашего вопроса, я не знаю какую задачу вы пытаетесь решить, но pandas код так не пишут (колонки со списками внутри это очень плохо), задача должна решаться по другому.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
fenrir1121
@fenrir1121
Начни с документации
Потому что
1) Любые объекты передаются в функции по ссылке, так что если вы изменяете объект, он изменится
2) Вы не копируете объект, а ссылаетесь на него
In [15]: a = [1, 2, 3]

In [16]: b = a

In [17]: c = a[:]

In [18]: a is b
Out[18]: True  # переменные ссылаются на один и тот же объект

In [19]: a is c 
Out[19]: False # в c лежит плоская копия a
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы