Pandas 当将数据帧传递给函数时,熊猫什么时候会按引用传递还是按值传递?
在上面的示例中,dropdf()不修改原始数据帧x,而changecell()修改x。我知道如果我在changecell()中添加微小的更改,它将不会更改xPandas 当将数据帧传递给函数时,熊猫什么时候会按引用传递还是按值传递?,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
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)