You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataFrame复制异常:修改副本为何会影响原DataFrame?

问题解析:为什么修改df_new会影响原df?

嘿,这个现象完全是因为你创建df_new的方式不对——你根本没生成原DataFrame的副本,只是给它加了个“别名”而已!我给你拆解清楚:

核心原因:Python的引用赋值机制

当你执行:

df_new = df

这行代码没有创建任何新的DataFrame对象,它只是让变量df_new和df指向了内存中同一个DataFrame实例。就好比你给你的猫同时起了“咪咪”和“花花”两个名字,不管你叫哪个名字去给它剪毛,这只猫本身的样子都会改变。

Pandas的DataFrame是可变对象,对这类对象的直接赋值操作,传递的是对象的引用而非数据副本。所以你后续修改df_new['Age']的时候,本质上就是在修改df所指向的那个原始DataFrame的数据,自然两者的结果会同步变化。

和副本创建方式的关系:完全相关!

你遇到的问题恰恰就是因为你没有真正创建副本,只是做了引用赋值。如果想要让df_new成为和原df完全独立的新DataFrame,必须使用Pandas提供的.copy()方法:

df_new = df.copy()  # 默认是深拷贝,deep=True

这样执行之后,df_new会拥有自己独立的数据存储空间,修改它的任何列都不会影响到原df了。

额外提一句:如果你的DataFrame里包含嵌套的复杂数据结构(比如列表、字典),可以显式指定deep=True(默认就是这个值)来确保所有嵌套数据也被完整拷贝;如果只是需要浅拷贝(只拷贝顶层结构,嵌套部分仍共享引用),可以用df.copy(deep=False),不过这种场景比较少见。

验证修改后的效果

把你的代码改成这样试试:

data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
df_new = df.copy()  # 这里用copy()创建独立副本
df_new['Age'] = df_new['Age'] * 90 / 100
print(df_new)
print(df)

这时候你会发现df的Age列还是原来的数值,而df_new的Age列是修改后的值,两者彻底独立了。

内容的提问来源于stack exchange,提问作者foo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:58:29