如何复制DataFrame中含集合的列且修改新列不影响原列?
解决DataFrame中集合列复制后原列被修改的问题
你遇到的问题核心在于可变对象的浅拷贝特性:集合(set)是Python中的可变对象,xy[2].copy()对Series做的是浅拷贝——它只是复制了每个元素(也就是集合对象)的引用,而不是为每个集合创建一个全新的副本。这就导致新列3和原列2里的集合指向的是同一个内存对象,修改其中一个,另一个自然也会跟着变。
两种可行的解决方案
1. 用apply(set)生成新集合
可以通过apply方法,对原列的每个集合调用set()构造函数,生成一个独立的新集合:
import pandas as pd xy = pd.DataFrame(columns=[2]) xy.at[1, 2] = {1,2,3,4} # 用apply创建每个集合的副本 xy[3] = xy[2].apply(set) xy.at[1,3].add(5) print(xy)
输出结果会符合你的预期:
2 3 1 {1,2,3,4} {1,2,3,4,5}
2. 使用深拷贝(copy.deepcopy)
如果你的集合里还嵌套了其他可变对象,深拷贝会更稳妥。先导入copy模块,然后对每个集合做深拷贝:
import pandas as pd import copy xy = pd.DataFrame(columns=[2]) xy.at[1, 2] = {1,2,3,4} # 对每个集合执行深拷贝 xy[3] = xy[2].apply(copy.deepcopy) xy.at[1,3].add(5) print(xy)
这个方法同样能得到你想要的结果,而且适用于更复杂的嵌套可变对象场景。
验证独立性
你可以通过打印两个集合的内存地址来确认它们已经是独立对象了:
print(id(xy.at[1,2])) print(id(xy.at[1,3]))
输出的两个ID会完全不同,说明它们指向的是内存中两个不同的集合,修改其中一个不会影响另一个。
内容的提问来源于stack exchange,提问作者Radeau
相关产品推荐
相关产品推荐

