熊猫在函数内编辑数据帧而不返回数据帧对象



我正在编写一些代码来编辑函数范围内的数据帧,其中我返回一个单独编辑的变量,一个列表。


根据我对作用域的理解,如果一个变量在函数中被编辑但未赋值,那么该值将不会持久化到外部作用域中。喜欢这个:

def var_and_list_function(var, my_list):
var = var + 1
print(var)
my_list.append(50)
return my_list
var = 1
my_list = var_and_list_function(var, my_list) # local value is 2
2
var # but outside of the function it is still 1
1

所以,这就是我认为它应该与熊猫一起工作的方式,但这不是我发现的。我必须在函数中制作副本才能不编辑原始文件,即使没有如上所述返回。

dataframe = pd.DataFrame([1,1,1])
print(dataframe)
0
0  1
1  1
2  1
my_list = [18,15,16]
def dataframe_and_list_function(dataframe, my_list):
dataframe[0] = dataframe[0].apply(lambda x: x+1)
print('Your dataframe inside the function is:')
print(dataframe)
my_list.append(4)
return my_list
my_list = dataframe_and_list_function(dataframe, my_list)
Your dataframe inside the function is:
0
0  2
1  2
2  2

dataframe # but the dataframe itself has been edited without being returned
0
0  2
1  2
2  2

这个问题有意义吗?

我希望数据帧

不会在被调用函数的范围之外进行编辑,但在这里我们看到数据帧在本地范围内编辑并在外部范围内重写。

我是否遇到了熊猫的已知问题?或者更确切地说,这根本不是一个问题,只是从 Python 到 Pandas 的实现不一致?后者是我的假设,但话又说回来我不确定,这就是我问的原因!

马拉在评论中做出了回应,并在发布后立即回答了这个问题。

这是 Python 中的预期行为。熊猫数据帧是可变对象;您可能会认为它们是通过引用传递的。因此,当您更改引用的对象时,您实际上会更改原始数据帧。相同的逻辑适用于列表、字典和其他可变类型。但是,对于不可变类型(int,str,bool(,这将是您所期望的

最新更新