Mic*_*ael 5 python global local pandas
为什么下面的函数会改变全局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')
Run Code Online (Sandbox Code Playgroud)
来自文档:
数据的可变性和复制
所有 Pandas 数据结构都是值可变的(它们包含的值可以改变)但并不总是大小可变的。Series 的长度无法更改,但是,例如,可以将列插入到 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
Run Code Online (Sandbox Code Playgroud)
df2 是参考 df
In [28]: id(df) == id(df2)
Out[28]: True
Run Code Online (Sandbox Code Playgroud)
您的函数不会改变参数 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
Run Code Online (Sandbox Code Playgroud)