【问题标题】:Why Does this DataFrame Modification within Function Change Global Outside Function?为什么函数内的这个 DataFrame 修改会改变全局外部函数?
【发布时间】:2016-06-15 21:47:40
【问题描述】:

为什么下面的函数会更改名为df 的全局DataFrame?它不应该只是更改函数内的本地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')

【问题讨论】:

  • 阅读this。如果您需要 DF 的独立副本,请使用此方法:df2 = df.copy()
  • 所以添加一列是唯一可以改变全局DataFrame的事情之一???对于没有明确声明的特定类型的对象,似乎可变性应该是全有或全无的事情。他们甚至没有列出其他可变的属性!不过,感谢您的解释。

标签: python pandas global local


【解决方案1】:

来自docs

数据的可变性和复制

所有 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2017-03-08
    • 2014-06-19
    相关资源
    最近更新 更多