Pandas 当将数据帧传递给函数时,熊猫什么时候会按引用传递还是按值传递?

Pandas 当将数据帧传递给函数时,熊猫什么时候会按引用传递还是按值传递?,pandas,numpy,pass-by-reference,immutability,deep-copy,Pandas,Numpy,Pass By Reference,Immutability,Deep Copy,在上面的示例中,dropdf()不修改原始数据帧x,而changecell()修改x。我知道如果我在changecell()中添加微小的更改,它将不会更改x 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.DataF

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

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
我不认为在我编写的每个函数中都包含
df=df.copy()
是很优雅的

问题

1) 熊猫在什么情况下会更改原始数据帧,何时不会更改?有人能给我一个明确的归纳规则吗?我知道这可能与易变性和不变性有关,但在stackoverflow中没有明确解释

2) numpy的行为是相似的还是不同的?其他python对象呢


PS:我已经做了stackoverflow的研究,但是没有找到一个明确的归纳规则来解决这个问题。

没有什么可以处理的。这是一个可变值上的变量问题。在dropdf中,将df设置为局部变量

与列表相同:

def changecell(df):
    df = df.copy()
    df['y'][0] = 99
在第二个函数中,如果您编写了以下内容,则它将是相同的:

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

def local_(l):
    l=l+[0]  
所以你不会影响
l


这里是发生的情况。

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

带有显式副本的示例:

def local_(l):
    l2=l+[0]
若未完成显式复制,则传递的原始对象将更改

#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)