为何修改DataFrame副本时原始DataFrame也会被更新?
问题原因与解决办法
问题根源
你遇到的问题核心在于Pandas的DataFrame是可变对象:当你把base传入dosomething函数时,函数接收的是原始DataFrame的引用,而非独立的副本。这意味着函数里对df的修改会直接作用在原始的base上,导致它也被同步更新。
解决办法
有两种实用的方式可以避免这个问题:
方式1:传入函数前先创建副本
调用函数时,用copy()方法生成base的独立副本,再传给函数操作:
import pandas as pd # 创建基础df base = pd.DataFrame([[1,2],[3,4]]) # 对df执行操作的简单函数 def dosomething(df): df[0] = [5,6] return df # 传入base的副本而非原始对象 new = dosomething(base.copy()) # 打印new和base df print(new) print(base)
运行后base会保持原始状态:
0 1 0 5 2 1 6 4 0 1 0 1 2 1 3 4
方式2:在函数内部创建副本再修改
修改dosomething函数,先对传入的DataFrame创建副本,再操作副本并返回:
import pandas as pd # 创建基础df base = pd.DataFrame([[1,2],[3,4]]) # 对df执行操作的简单函数 def dosomething(df): # 先创建传入df的独立副本 df_copy = df.copy() df_copy[0] = [5,6] return df_copy # 创建新df new = dosomething(base) # 打印new和base df print(new) print(base)
这种方式下,无论调用时传入的是原始对象还是其他引用,函数内部都会操作独立副本,不会影响原始数据。
补充说明
如果你的DataFrame包含嵌套对象(比如列里有列表、字典),需要用copy(deep=True)来创建深度副本,确保所有嵌套结构都被独立复制。默认的copy()是浅复制,对简单数值型DataFrame已经足够使用。
内容的提问来源于stack exchange,提问作者Michael Wilson
相关产品推荐
相关产品推荐

