Pandas 1.5.3浅拷贝疑问:为何df['A']=[...]无法更新副本?
Pandas 1.5.3浅拷贝同步差异问题解析
先看问题中的示例代码:
import pandas as pd df = pd.DataFrame({ 'A': [1,1, 1], 'B': [2,2, 2] }) df2 = df.copy(False) # 浅拷贝 df['A'] = [10,10,10]
实际结果中df2的'A'列仍为[1,1,1],但预期是同步更新为[10,10,10];而执行以下操作时,df2能正常同步:
df['A'] += [10,10,10]- 修改单个值:
df['A'][0] = 10
核心原因:浅拷贝共享「列对象引用」,而非强制绑定列的指向
Pandas的浅拷贝(deep=False)本质是:创建一个新的DataFrame外壳,但共享原DataFrame中各列的Series对象引用。不同操作对原DataFrame的影响不同,导致拷贝对象是否同步:
df['A'] = [10,10,10]:替换列引用,而非修改原列内容
这个操作是给df的'A'列重新赋值了一个全新的Series对象,相当于把df里'A'的指向从旧Series换成了新Series。而df2的'A'列依然指向原来的旧Series,自然看不到新值。df['A'] += [10,10,10]:原地修改原Series内容+=属于原地(in-place)操作,它不会创建新的Series,而是直接修改原Series内部的数值。因为df2的'A'列和df的'A'列共享同一个Series引用,所以修改后df2会同步看到变化。df['A'][0] = 10:直接修改原Series的元素
这种操作是直接定位到原Series的某个元素并修改值,同样属于原地修改原Series的内容,共享引用的df2自然会同步更新。
简单总结:浅拷贝只保证共享现有列的内容,但当你给原DataFrame的列「换了个新对象」时,拷贝对象不会自动跟着换引用;只有当你修改「原有列对象内部的内容」时,拷贝才会同步。
内容的提问来源于stack exchange,提问作者user8560167
相关产品推荐
相关产品推荐

