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