通过引用传递pandas DataFrame

lab*_*nth 2 python immutability pass-by-reference dataframe pandas

我的问题是关于 Pandas DataFrame 在通过引用传递时的不变性。考虑以下代码:

import pandas as pd

def foo(df1, df2):

    df1['B'] = 1
    df1 = df1.join(df2['C'], how='inner')

    return()

def main(argv = None):

    # Create DataFrames. 
    df1 = pd.DataFrame(range(0,10,2), columns=['A'])
    df2 = pd.DataFrame(range(1,11,2), columns=['C'])

    foo(df1, df2)    # Pass df1 and df2 by reference.

    print df1

    return(0)

if __name__ == '__main__':
    status = main()
    sys.exit(status)
Run Code Online (Sandbox Code Playgroud)

输出是

   A  B  
0  0  1
1  2  1
2  4  1
3  6  1
4  8  1
Run Code Online (Sandbox Code Playgroud)

并不是

   A  B  C
0  0  1  1
1  2  1  3
2  4  1  5
3  6  1  7
4  8  1  9
Run Code Online (Sandbox Code Playgroud)

事实上,如果 foo 被定义为

def foo(df1, df2):

    df1 = df1.join(df2['C'], how='inner')
    df1['B'] = 1

    return()
Run Code Online (Sandbox Code Playgroud)

(即另一个语句之前的“join”语句)那么输出就是

   A    
0  0 
1  2 
2  4 
3  6 
4  8
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么会这样。任何见解将不胜感激。

Jez*_*mon 9

问题是因为这一行:

df1 = df1.join(df2['C'], how='inner')
Run Code Online (Sandbox Code Playgroud)

df1.join(df2['C'], how='inner')返回一个新的数据帧。在这一行之后,df1不再引用与参数相同的数据帧,而是一个新的数据帧,因为它已被重新分配给新结果。第一个数据帧继续存在,未修改。这不是真正的熊猫问题,只是 python 和大多数其他语言的一般工作方式。

一些 Pandas 函数有一个inplace参数,它可以做你想要的,但是连接操作没有。如果你需要修改一个数据框,你必须返回这个新的,并在函数之外重新分配它。


Ami*_*ory 5

Python 没有按值传递和按引用传递——只有从名称到对象的绑定

如果您将函数更改为

def foo(df1, df2):

    res = df1.join(df2['C'], how='inner')
    res['B'] = 1

    return res
Run Code Online (Sandbox Code Playgroud)

然后df1df2在函数中,绑定到你发送的对象。的结果,join在本例中是一个新对象,绑定到名称res。您可以操作它并返回它,而不会影响任何其他对象或绑定。

在你的调用代码中,你可以写

print foo(df1, df2)
Run Code Online (Sandbox Code Playgroud)