Pandas: Subindexando los marcos de datos: Copias vs vistas

Digamos que tengo un dataframe

import pandas as pd import numpy as np foo = pd.DataFrame(np.random.random((10,5))) 

y creo otro dataframe a partir de un subconjunto de mis datos:

 bar = foo.iloc[3:5,1:4] 

¿ bar tiene una copia de esos elementos de foo ? ¿Hay alguna manera de crear una view de esos datos en su lugar? Si es así, ¿qué pasaría si trato de modificar los datos en esta vista? ¿Pandas proporciona algún tipo de mecanismo de copia en escritura ?

Su respuesta se encuentra en los documentos de pandas: devolver una vista frente a una copia .

Siempre que una matriz de tags o un vector booleano estén involucrados en la operación de indexación, el resultado será una copia . Con la indexación y el corte de una sola etiqueta / escalar, por ejemplo, df.ix [3: 6] o df.ix [:, ‘A’], se devolverá una vista .

En tu ejemplo, la bar es una vista de rebanadas de foo . Si desea una copia , podría haber utilizado el método de copy . La bar modificación también modifica foo . pandas no parece tener un mecanismo de copia en escritura.

Vea mi ejemplo de código a continuación para ilustrar:

 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