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的研究,但无法找到解决这个问题的明确规则。答案 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。