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)
我很好奇为什么会这样。任何见解将不胜感激。
问题是因为这一行:
df1 = df1.join(df2['C'], how='inner')
Run Code Online (Sandbox Code Playgroud)
df1.join(df2['C'], how='inner')返回一个新的数据帧。在这一行之后,df1不再引用与参数相同的数据帧,而是一个新的数据帧,因为它已被重新分配给新结果。第一个数据帧继续存在,未修改。这不是真正的熊猫问题,只是 python 和大多数其他语言的一般工作方式。
一些 Pandas 函数有一个inplace参数,它可以做你想要的,但是连接操作没有。如果你需要修改一个数据框,你必须返回这个新的,并在函数之外重新分配它。
Python 没有按值传递和按引用传递——只有从名称到对象的绑定。
如果您将函数更改为
def foo(df1, df2):
res = df1.join(df2['C'], how='inner')
res['B'] = 1
return res
Run Code Online (Sandbox Code Playgroud)
然后df1,df2在函数中,绑定到你发送的对象。的结果,join在本例中是一个新对象,绑定到名称res。您可以操作它并返回它,而不会影响任何其他对象或绑定。
在你的调用代码中,你可以写
print foo(df1, df2)
Run Code Online (Sandbox Code Playgroud)