对df.copy()使用applymap却修改原始DataFrame的原因是什么?
问题原因说明
- 核心原因是
pandas.DataFrame.copy()默认执行浅拷贝:浅拷贝仅复制DataFrame的轴标签、数据结构,以及对单元格存储对象的引用,不会递归复制嵌套的可变对象(你案例中的列表就是典型的可变对象)。也就是说,浅拷贝得到的dfcopy和原results中,对应单元格存储的列表指向内存中的同一个对象。 - 你使用的
list.sort()是列表的原地排序方法,会直接修改调用它的列表对象本身,而不是返回新的排序后列表。所以虽然你是在dfcopy上执行操作,但本质修改的是两个DataFrame共用的列表对象,自然会同步修改到原DataFrame的数据。
解决方法
两种方案可选:
- 拷贝时改用深拷贝,直接递归复制所有嵌套的可变对象,让副本和原数据完全独立:
dfcopy = results[['years', 'line_items']].copy(deep=True) # 后续排序逻辑不变 dfcopy.applymap(lambda x: x.sort())
- 排序时避免使用原地方法,改用
sorted()函数,它会返回新的排序后列表,不会修改原引用对象,不需要修改拷贝逻辑:
# 不需要修改拷贝代码,仅修改排序逻辑即可 dfcopy = dfcopy.applymap(lambda x: sorted(x))
内容的提问来源于stack exchange,提问作者geds133
相关产品推荐
相关产品推荐

