Skip to main content
 首页 » 编程设计

python之通过引用传递 pandas DataFrame

2025年05月04日9leader

我的问题是关于 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) 

输出是

   A  B   
0  0  1 
1  2  1 
2  4  1 
3  6  1 
4  8  1 

而不是

   A  B  C 
0  0  1  1 
1  2  1  3 
2  4  1  5 
3  6  1  7 
4  8  1  9 

其实如果foo定义为

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

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

   A     
0  0  
1  2  
2  4  
3  6  
4  8 

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

请您参考如下方法:

问题是因为这一行:

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

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

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