Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DataFrame作为默认函数参数未按预期工作_Python_Python 3.x_Pandas_Function_Dataframe - Fatal编程技术网

Python DataFrame作为默认函数参数未按预期工作

Python DataFrame作为默认函数参数未按预期工作,python,python-3.x,pandas,function,dataframe,Python,Python 3.x,Pandas,Function,Dataframe,我不明白为什么作为默认函数参数的DataFrame不能像我预期的那样工作。这让我很困惑,为什么我还要在函数调用中指定它 基本上,我已经创建了一个基于键(如左连接)将数据帧合并到主数据帧(我将其设置为默认参数)的函数 简化数据框(同一学生的科目分数不同): 函数(我想通过将其合并到主df,一个接一个地获得他的科目分数) 使用函数合并两次: 现在我不明白了。我在第二次合并中失去了eng_分数。不知何故,当我第二次将dfA分配给merge\u selected时,它被删除了 student ma

我不明白为什么作为默认函数参数的DataFrame不能像我预期的那样工作。这让我很困惑,为什么我还要在函数调用中指定它

基本上,我已经创建了一个基于键(如左连接)将数据帧合并到主数据帧(我将其设置为默认参数)的函数

简化数据框(同一学生的科目分数不同): 函数(我想通过将其合并到主df,一个接一个地获得他的科目分数) 使用函数合并两次: 现在我不明白了。我在第二次合并中失去了
eng_分数。不知何故,当我第二次将
dfA
分配给
merge\u selected
时,它被删除了

  student  math_score  sci_score
0       A          50         80
但是如果我在函数调用中指定了
main\u df=dfA

dfA = merge_selected(dfB, main_df = dfA)
dfA = merge_selected(dfC, main_df = dfA)
我不会失去
eng_分数
并得到他的所有分数:

  student  math_score  eng_score  sci_score
0       A          50         70         80
基本上我已经解决了这个问题,但希望有人能对此有所启发

为什么我仍然必须指定
main_df
,即使它应该默认为
dfA


另外,如果我没有指定
main_df=dfA
,为什么我会丢失
eng_分数呢?

当您使用默认参数main_df=dfA定义函数时,函数会“记住”数据帧dfA,以便将来调用。让我们给这个dfA的“原始形式”起个名字:orig_dfA,就像在创建函数时一样

现在,第一次调用合并所选的。您最终使用orig_-dfA创建了一个新的合并数据帧,它存储在内存中的某个地方,与orig_-dfA不同

然后从函数返回并将dfA分配给这个新的合并数据帧。事情是这样的。你实际上根本没有改变原貌。您只是让名称“dfA”引用这个新的合并数据帧,它存储在内存中与orig_dfA不同的位置。但是该函数仍然连接到orig_dfA,它没有改变-该函数不知道您希望main_df的默认值现在成为“dfA”所指的新数据帧

因此,当涉及到第二个函数调用时,第一个函数调用似乎从未发生过

这里有一个简单的例子来说明这一点。与前面一样,使用main_df的默认值定义函数。现在,在定义函数之后,立即将dfA更改为完全不是数据帧的内容,比如dfA=3。现在像第一次一样调用函数。您将获得完全相同的输出

这里发生的是两件事的混合:

  • 在Python中,赋值(=)操作符只是将名称绑定到内存中的对象/值。语句x=3的作用不是“留出一些内存,这些内存将被名称“x”引用,并将值3放在那里”,这可能是人们直觉上所期望的。相反,它更像是“在内存中的某个地方创建值3,并使名称“x”引用它”
  • 设置默认参数时,默认参数引用的对象/值在函数创建时确定,并且是固定的

  • 在您的情况下,在定义转换为“使main_df引用df_A当前引用的内存中的对象/值”的函数时,设置main_df=df_A。从这一点开始,您可以让df_A引用您喜欢的任何其他内存块-函数将始终引用创建函数时df_A引用的同一内存块,而不是实际调用函数时df_A碰巧引用的任何值。

    嘿,感谢您的解释!我只想澄清一件事。我理解,如果在函数调用期间没有指定main_df是什么,它将默认为创建函数时的dfA。但是如果我指定main_df=dfA,这是否意味着main_df现在将引用dfA当前引用的任何东西?是的,完全正确!不过别相信我,试试看:)。嘿,我已经试过了。事实上,如果我指定main_df,它指的是dfA当前所指的任何东西。谢谢你的详细解释,这很有帮助!
      student  math_score  sci_score
    0       A          50         80
    
    dfA = merge_selected(dfB, main_df = dfA)
    dfA = merge_selected(dfC, main_df = dfA)
    
      student  math_score  eng_score  sci_score
    0       A          50         70         80