将数据帧传递给函数时,pandas 何时执行按引用传递与按值传递?
When does pandas do pass-by-reference Vs pass-by-value when passing dataframe to a function?
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 什么情况下会改变原始数据帧,什么时候不会?有人能给我一个明确的通用规则吗?我知道这可能与可变性和不变性有关,但在 Whosebug 中没有明确解释。
2) numpy 的行为是相同的还是不同的?其他 python 个对象呢?
PS: 我在 Whosebug 上做了研究,但找不到一个明确的通用规则来解决这个问题。
没有什么可处理的 pandas。这是可变值上 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哪双鞋怎么回事。
默认情况下 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)
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 什么情况下会改变原始数据帧,什么时候不会?有人能给我一个明确的通用规则吗?我知道这可能与可变性和不变性有关,但在 Whosebug 中没有明确解释。
2) numpy 的行为是相同的还是不同的?其他 python 个对象呢?
PS: 我在 Whosebug 上做了研究,但找不到一个明确的通用规则来解决这个问题。
没有什么可处理的 pandas。这是可变值上 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哪双鞋怎么回事。
默认情况下 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)