为什么下面的函数会更改名为DataFrame
的全局df
?它不应该只更改函数中的本地df
,而不是全局df
吗?
import pandas as pd
df = pd.DataFrame()
def adding_var_inside_function(df):
df['value'] = 0
print(df.columns) # Index([], dtype='object')
adding_var_inside_function(df)
print(df.columns) # Index([u'value'], dtype='object')
答案 0 :(得分:4)
来自docs:
数据的可变性和复制
所有pandas数据结构都是值可变的(它们包含的值可以更改)但并非总是如此 大小可变的。系列的长度不能改变,但是,为 例如,可以将列插入到DataFrame中。但是,广阔 大多数方法产生新对象并保留输入数据 不变。但总的来说,我们喜欢支持不变性 明智的。
这是另一个例子,显示了值(单元格)的可变性:
In [21]: df
Out[21]:
a b c
0 3 2 0
1 3 3 1
2 4 0 0
3 2 3 2
4 0 4 4
In [22]: df2 = df
In [23]: df2.loc[0, 'a'] = 100
In [24]: df
Out[24]:
a b c
0 100 2 0
1 3 3 1
2 4 0 0
3 2 3 2
4 0 4 4
df2
是对df
In [28]: id(df) == id(df2)
Out[28]: True
你的功能,不会改变参数DF:
def adding_var_inside_function(df):
df = df.copy()
df['value'] = 0
return df
In [30]: df
Out[30]:
a b c
0 100 2 0
1 3 3 1
2 4 0 0
3 2 3 2
4 0 4 4
In [31]: adding_var_inside_function(df)
Out[31]:
a b c value
0 100 2 0 0
1 3 3 1 0
2 4 0 0 0
3 2 3 2 0
4 0 4 4 0
In [32]: df
Out[32]:
a b c
0 100 2 0
1 3 3 1
2 4 0 0
3 2 3 2
4 0 4 4