непреднамеренное изменение df, когда копия была сделана в пандах - PullRequest
0 голосов
/ 16 ноября 2018

Пусть df будет моим файлом данных pandas и dfcopy его копией,

data = [[1,['A1']],[3,['A2','A2','A1']], [1,['A2']]]  
df = pd.DataFrame(data)  
dfcopy = df.copy()  

     0    1  
0    1    ['A1']
1    3    ['A2', 'A2', 'A1']
2    1    ['A2']

идентификатор df - 1874789864000, а идентификатор dfcopy - 1874789865736. Отличается, как и ожидалось. Теперь я хочу удалить one 'A2' в позиции dfcopy [1,1] и уменьшить dfcopy [1,0] с помощью one (столбец 0 - длина списка в столбце 1)

dfcopy.at[1,0]=dfcopy.at[1,0]-1  
df =
     0    1  
0    1    ['A1']
1    3    ['A2', 'A2', 'A1']
2    1    ['A2']
dfcopy =
     0    1  
0    1    ['A1']
1    2    ['A2', 'A2', 'A1']
2    1    ['A2']

Как я и ожидал, количество в столбце 0 уменьшается только при dfcopy. Теперь я удаляю 'A2' элемента dfcopy [1,1]

dfcopy.at[1,1].remove('A2')
df =
     0    1  
0    1    ['A1']
1    3    [ 'A2', 'A1']
2    1    ['A2']
dfcopy =
     0    1  
0    1    ['A1']
1    2    [ 'A2', 'A1']
2    1    ['A2']

Идентификаторы все те же, что и раньше (не показаны), но теперь мой df изменен в позиции df [1,1]
почему это происходит, пока я определяю копию, и как мне это исправить?

intended output:  

df =
     0    1  
0    1    ['A1']
1    3    [ 'A2', 'A2', 'A1']
2    1    ['A2']
dfcopy =
     0    1  
0    1    ['A1']
1    2    [ 'A2', 'A1']
2    1    ['A2']

Я много смотрел в документальном фильме и здесь, в Stackoverflow, но не понимаю, почему это происходит.

ВРЕМЕННОЕ РЕШЕНИЕ

data = [[1,['A1']],[3,['A2','A2','A1']], [1,['A2']]]  
df = pd.DataFrame(data)  
dfcopy = df.copy()
dfcopy.at[1,0]=dfcopy.at[1,0]-1 
list = list(dfcopy.at[1,1])
list.remove('A2')
dfcopy.at[1,1] = list

df =
     0    1  
0    1    ['A1']
1    3    [ 'A2', 'A2', 'A1']
2    1    ['A2']
dfcopy =
     0    1  
0    1    ['A1']
1    2    [ 'A2', 'A1']
2    1    ['A2']

1 Ответ

0 голосов
/ 16 ноября 2018
import copy
df=copy.deepcopy(df)

может работать на вас!

Как упоминалось в комментарии,

.copy ()

имеет атрибут по умолчанию

deep = True

, но это не так глубоко, как вы хотите, чтобы это было

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