当将数据帧传递给函数时,pandas何时通过引用传递Vs传值?

时间:2017-10-29 18:17:36

标签: pandas numpy pass-by-reference immutability deep-copy

def dropdf_copy(df):
    df = df.drop('y',axis=1)

def dropdf_inplace(df):
    df.drop('y',axis=1,inplace=True)    

def changecell(df):
    df['y'][0] = 99


x = pd.DataFrame({'x': [1,2],'y': [20,31]})

x
Out[204]: 
   x   y
0  1  20
1  2  31

dropdf_copy(x)

x
Out[206]: 
   x   y
0  1  20
1  2  31

changecell(x)

x
Out[208]: 
   x   y
0  1  99
1  2  31

在上面的示例中,dropdf()不会修改原始数据帧x而changecell()会修改x。我知道如果我将较小的更改添加到changecell()它不会改变x。

def changecell(df):
    df = df.copy()
    df['y'][0] = 99

我不认为在我写的每个函数中包含df = df.copy()非常优雅。

问题

1)在什么情况下pandas会改变原始数据帧,什么时候不会?有人可以给我一个明确的普遍规则吗?我知道它可能与可变性Vs不变性有关,但在stackoverflow中没有明确解释。

2)numpy表现为simillary还是不同?其他python对象怎么样?

PS:我已经完成了stackoverflow的研究,但无法找到解决这个问题的明确规则。

2 个答案:

答案 0 :(得分:1)

默认情况下,python通过引用传递。只有在函数中进行显式复制(如赋值)或使用copy()函数时,传递的原始对象才会保持不变。

显式复制的示例:

#1. Assignment 
def dropdf_copy1(df):

    df = df.drop('y',axis=1)
#2. copy()
def dropdf_copy2(df):
    df = df.copy() 
    df.drop('y',axis=1,inplace = True)

如果未进行显式复制,则更改传递的原始对象。

def dropdf_inplace(df):
    df.drop('y',axis=1,inplace = True)

答案 1 :(得分:0)

没有什么可以处理大熊猫。它是可变值的local/global变量的问题。在dropdf中,将df设置为局部变量。

与列表相同:

def global_(l):
    l[0]=1

def local_(l):
    l=l+[0]  

在第二个函数中,如果你写了:

,它将是相同的
def local_(l):
    l2=l+[0]

所以你不会影响l

这里发生了python tutor exemple