复制后的DataFrame与源DataFrame是否等价?为何地址独立却同步变更?
Pandas DataFrame复制后同步变更的原因分析
问题现象
执行以下步骤后,发现两个DataFrame的内存地址完全独立,但修改其中一个的元素时,另一个的内容也会同步变更:
- 创建原始DataFrame
- 通过
pd.DataFrame(原DataFrame)创建复制版 - 修改源DataFrame的元素
- 修改复制后DataFrame的元素
- 检查两者的内存地址与内容
代码示例
import pandas as pd gl_stock_001 = pd.DataFrame({'prc': [3], 'sum': [2], 'dif': [1]}) stock_copy = pd.DataFrame(gl_stock_001) display(gl_stock_001) display(stock_copy) print(id(gl_stock_001), id(stock_copy)) gl_stock_001.loc[0,'sum'] = 777 stock_copy.loc[0,'dif'] = 333 display(gl_stock_001) display(stock_copy) print(id(gl_stock_001), id(stock_copy))
操作结果

原因解析
这是因为你使用的是**Pandas的浅拷贝(Shallow Copy)**机制:
- 当通过
pd.DataFrame(原DataFrame)构造新对象时,Pandas会创建一个新的DataFrame实例(所以id()返回的内存地址不同),但这个新对象并不会复制底层的实际数据(即存储列值的numpy数组),而是直接共享原DataFrame的数据块。 - 当你通过
loc修改元素时,本质是在修改共享的底层数据数组,因此两个DataFrame都会同步显示修改后的结果。 - 如果需要创建完全独立、修改互不影响的拷贝,应该使用DataFrame的
copy()方法(默认deep=True,可直接写stock_copy = gl_stock_001.copy()),这样会完整复制底层数据,实现真正的独立拷贝。
内容的提问来源于stack exchange,提问作者WD168
相关产品推荐
相关产品推荐

