如何将Pandas DataFrame传入函数且不修改全局原始版本?
解决Pandas DataFrame函数内操作不修改全局原始版本的问题
这确实容易让人困惑!你遇到的问题其实和Python的可变对象传参机制以及Pandas DataFrame的特性有关,并不是你了解的Python作用域规则出了问题。
先来看你的示例代码:
import pandas as pd xTest = pd.DataFrame({'A' : ['Test']}) def MyFunction(): _xTest=xTest _xTest['yPred'] = 1 return _xTest res=MyFunction() xTest.head()
运行后全局的xTest被添加了yPred列,原因在于:
- 当你在函数里写
_xTest = xTest时,并没有创建一个新的DataFrame对象,只是让局部变量_xTest指向了和全局xTest同一个DataFrame对象。 - Pandas的DataFrame是可变对象,对它进行的原地修改(比如添加列、修改值等)会直接作用于原对象本身,不管这个对象是被全局变量还是局部变量引用。
解决方法:创建DataFrame的拷贝
要避免修改全局的原始DataFrame,你需要在函数内创建一个独立的拷贝,这样局部变量操作的就是一个全新的对象,不会影响原数据。具体可以使用Pandas的copy()方法:
修改后的代码示例:
import pandas as pd xTest = pd.DataFrame({'A' : ['Test']}) def MyFunction(): _xTest = xTest.copy() # 创建DataFrame的拷贝 _xTest['yPred'] = 1 return _xTest res=MyFunction() xTest.head() # 此时全局的xTest不会包含'yPred'列
关于拷贝的补充说明
- 默认的
copy()是浅拷贝:它会复制DataFrame的结构和顶层数据,但如果DataFrame里包含嵌套的可变对象(比如列表、字典),浅拷贝不会复制这些嵌套对象,修改它们仍会影响原数据。 - 如果你的DataFrame包含嵌套可变对象,可以使用深拷贝:
xTest.copy(deep=True),它会递归复制所有嵌套的可变对象,确保完全独立于原数据。
内容的提问来源于stack exchange,提问作者Reddspark
相关产品推荐
相关产品推荐

