python - 通过引用传递 pandas DataFrame

标签 python pandas dataframe pass-by-reference immutability

我的问题是关于 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 参数,它会做你想做的,但是连接操作没有。如果您需要修改数据框,则必须返回这个新数据框并在函数外重新分配它。

关于python - 通过引用传递 pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39783570/

相关文章:

python - 如何将列表转换为 Pandas 数据框

python - 在 Python 中接收原始 TLS 数据包

python - 将行添加到现有 pandas 数据框的最快方法

python - 在 Pandas 中映射

python - 检查 pandas 数据框列中的值是否存在于另一列中。 isin 方法不起作用

python - 获取 HTML 源代码,包括 javascript 和身份验证的结果

python - 有没有办法在 gunicorn 中记录 python 打印语句?

mysql - 将字典键映射到 Mysql 数据库表列

python - 零值的 Pandas groupby

r - 如何整合两个不同日期的数据集的数据?