python - read - Pandas: Subindexando los marcos de datos: Copias vs vistas
python read excel (1)
Digamos que tengo un marco de datos
import pandas as pd
import numpy as np
foo = pd.DataFrame(np.random.random((10,5)))
y creo otro marco de datos 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 copy-on-write ?
Su respuesta se encuentra en los documentos de pandas: returning-a-view-versus-a-copy .
Siempre que una matriz de etiquetas 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