Python中pandas的copy()方法失效问题及正确用法咨询
问题
我有一个pandas DataFrame,希望创建它的副本并在副本上执行操作,确保不影响原数据。但使用.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)
输出结果:
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
可以看到原数据集df也受到了影响,请问这是什么原因,正确的做法应该是什么?
问题原因
- 元素引用重复:创建df时,A列的三个元素都指向同一个numpy数组
x,三者共享同一个内存对象,修改其中任何一个都会同步影响其他元素。 copy()的行为限制:df.copy()默认是深拷贝(deep=True),但它仅复制DataFrame的结构和元素的引用,不会对numpy数组这类可变对象本身进行递归深拷贝。因此修改副本中数组的内容时,原DataFrame里的数组引用也会同步看到变化。
正确做法
方法1:创建DataFrame时使用独立数组元素
避免多个元素共享同一数组引用,每个元素生成独立的numpy数组:
import pandas as pd import numpy as np # 每个元素都是新的数组,无引用共享 df = pd.DataFrame({'A': [np.array([1,2]), np.array([1,2]), np.array([1,2])], 'B': [4, 5, 6]}) duplicate = df.copy() duplicate['A'].values[0][[0,1]] = 0 print(duplicate) print(df)
方法2:对副本的object列做元素级深拷贝
针对已存在的共享引用DataFrame,先断开A列元素的引用关联,再修改:
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() # 对A列每个数组独立拷贝,切断与原数组的引用 duplicate['A'] = duplicate['A'].apply(lambda arr: arr.copy()) duplicate['A'].values[0][[0,1]] = 0 print(duplicate) print(df)
方法3:使用标准库做完全深拷贝
借助copy.deepcopy()递归拷贝所有层级的对象,彻底断开与原DataFrame的关联:
import pandas as pd import numpy as np import copy x = np.array([1,2]) df = pd.DataFrame({'A': [x, x, x], 'B': [4, 5, 6]}) # 完全深拷贝所有嵌套对象 duplicate = copy.deepcopy(df) duplicate['A'].values[0][[0,1]] = 0 print(duplicate) print(df)
内容的提问来源于stack exchange,提问作者Amin Shn
相关产品推荐
相关产品推荐

