假设我有一个数据框(DataFrame)
import pandas as pd
import numpy as np
foo = pd.DataFrame(np.random.random((10,5)))
我从数据的子集中创建了另一个数据帧:
bar = foo.iloc[3:5,1:4]
bar
是否保存了从foo
中复制的那些元素?有没有办法创建一个该数据的view
?如果有,那么在这个view
中尝试修改数据会发生什么?Pandas提供任何形式的写时复制机制吗?
假设我有一个数据框(DataFrame)
import pandas as pd
import numpy as np
foo = pd.DataFrame(np.random.random((10,5)))
我从数据的子集中创建了另一个数据帧:
bar = foo.iloc[3:5,1:4]
bar
是否保存了从foo
中复制的那些元素?有没有办法创建一个该数据的view
?如果有,那么在这个view
中尝试修改数据会发生什么?Pandas提供任何形式的写时复制机制吗?
您可以在pandas文档中找到答案:返回视图与副本
每当涉及标签数组或布尔向量的索引操作时,结果将会是一个副本。使用单个标签/标量索引和切片,例如df.ix[3:6]或df.ix [:,'A'],将返回一个视图。
在您的示例中,bar
是foo
切片的视图。如果您想要一个副本,可以使用copy
方法。修改bar
也会修改foo
。pandas似乎没有写时复制机制。
请参见下面的代码示例:
In [1]: import pandas as pd
...: import numpy as np
...: foo = pd.DataFrame(np.random.random((10,5)))
...:
In [2]: pd.__version__
Out[2]: '0.12.0.dev-35312e4'
In [3]: np.__version__
Out[3]: '1.7.1'
In [4]: # DataFrame has copy method
...: foo_copy = foo.copy()
In [5]: bar = foo.iloc[3:5,1:4]
In [6]: bar == foo.iloc[3:5,1:4] == foo_copy.iloc[3:5,1:4]
Out[6]:
1 2 3
3 True True True
4 True True True
In [7]: # Changing the view
...: bar.ix[3,1] = 5
In [8]: # View and DataFrame still equal
...: bar == foo.iloc[3:5,1:4]
Out[8]:
1 2 3
3 True True True
4 True True True
In [9]: # It is now different from a copy of original
...: bar == foo_copy.iloc[3:5,1:4]
Out[9]:
1 2 3
3 False True True
4 True True True