英文:
The copy() method in Python does not work properly
问题
我有一个pandas数据框,我想创建一个副本并对副本进行一些操作,而不影响原始数据框。我使用".copy()"方法,但出于某种原因它不起作用!以下是我的代码:
import pandas as pd
import numpy as np
x = np.array([1,2])
df = pd.DataFrame({'A': [x, x, x], 'B': [4, 5, 6]})
duplicate = df.copy()
duplicate['A'].values[0][[0,1]] = 0
print(duplicate)
print(df)
正如您所看到的,“df”(原始数据集)也受到影响。有谁知道为什么,以及如何正确完成这个操作?
英文:
I have a pandas dataframe that I would like to make a duplicate of and do some operations on the duplicated version without affecting the original one. I use ".copy()" method but for some reason it doesn't work! Here is my code:
import pandas as pd
import numpy as np
x = np.array([1,2])
df = pd.DataFrame({'A': [x, x, x], 'B': [4, 5, 6]})
duplicate = df.copy()
duplicate['A'].values[0][[0,1]] = 0
print(duplicate)
print(df)
A B
0 [0, 0] 4
1 [0, 0] 5
2 [0, 0] 6
A B
0 [0, 0] 4
1 [0, 0] 5
2 [0, 0] 6
As you can see "df" (the original dataset) gets affected as well. Does anyone know why, and how this should be done correctly?
答案1
得分: 2
问题实际上出在列表值上,而不是数据框本身。当您复制数据框时,即使默认情况下是深复制,它并不对值本身执行深复制,因此,如果值是一个列表,引用将被复制,您可以根据以下事实来判断:即使您只尝试修改第一行,但在您的副本中所有A
的值都被修改。
正确的方法可能是:
import pandas as pd
import numpy as np
from copy import deepcopy # <- **
x = np.array([1,2])
df = pd.DataFrame({'A': [x, x, x], 'B': [4, 5, 6]})
duplicate = df.copy()
duplicate['A'] = duplicate["A"].apply(deepcopy) # <- **
duplicate['A'].values[0][[0,1]] = 0
print(duplicate)
print(df)
A B
0 [0, 0] 4
1 [1, 2] 5
2 [1, 2] 6
A B
0 [1, 2] 4
1 [1, 2] 5
2 [1, 2] 6
英文:
The problem is actually in the list value rather than the df itself. When you are copying the dataframe, even if it's by default a deep copy, it's not doing deepcopy on the value itself, so if the value is a list, the reference is copied over, you can tell this by the fact that even though you only tried to modify the first row, but all values of A
in your duplicate are modified.
The proper way is probably:
import pandas as pd
import numpy as np
from copy import deepcopy # <- **
x = np.array([1,2])
df = pd.DataFrame({'A': [x, x, x], 'B': [4, 5, 6]})
duplicate = df.copy()
duplicate['A'] = duplicate["A"].apply(deepcopy) # <- **
duplicate['A'].values[0][[0,1]] = 0
print(duplicate)
print(df)
A B
0 [0, 0] 4
1 [1, 2] 5
2 [1, 2] 6
A B
0 [1, 2] 4
1 [1, 2] 5
2 [1, 2] 6
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论