python - tablas - Comprobando si el marco de datos es copiar o ver en Pandas
seleccionar columnas de un dataframe pandas (2)
Puede rastrear la memoria que consume su entorno pandas / python y, en el supuesto de que una copia utilizará más memoria que una vista, podrá decidir de una u otra forma.
Creo que hay bibliotecas por ahí que presentarán el uso de la memoria en el propio entorno de Python, por ejemplo, Heapy / Guppy.
Debería haber una métrica que pueda aplicar que tome una imagen de referencia del uso de la memoria antes de crear el objeto bajo inspección, y luego otra imagen después. La comparación de los dos mapas de memoria (suponiendo que no se haya creado nada más y podamos aislar el cambio se debe al nuevo objeto) debe proporcionar una idea de si se ha producido una vista o copia.
Tendríamos que tener una idea de los diferentes perfiles de memoria de cada tipo de implementación, pero algunos experimentos deberían dar resultados.
¿Hay una manera fácil de verificar si dos marcos de datos son copias diferentes o vistas de los mismos datos subyacentes que no implican manipulaciones? Estoy tratando de controlar cuándo se genera cada uno, y dada la idiosincrásica que parecen ser las reglas, me gustaría una forma fácil de probar.
Por ejemplo, pensé que "id (df.values)" sería estable en todas las vistas, pero no parecen ser:
# Make two data frames that are views of same data.
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = [''row1'',''row2''],
columns = [''a'',''b'',''c'',''d''])
df2 = df.iloc[0:2,:]
# Demonstrate they are views:
df.iloc[0,0] = 99
df2.iloc[0,0]
Out[70]: 99
# Now try and compare the id on values attribute
# Different despite being views!
id(df.values)
Out[71]: 4753564496
id(df2.values)
Out[72]: 4753603728
# And we can of course compare df and df2
df is df2
Out[73]: False
Otras respuestas que he buscado que intentan dar reglas, pero no parecen ser coherentes, y tampoco responden esta pregunta de cómo realizar la prueba:
Y por supuesto: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy
ACTUALIZACIÓN: los comentarios a continuación parecen responder la pregunta: mirar el atributo df.values.base
lugar del atributo df.values
hace, al igual que una referencia al atributo df._is_copy
(aunque este último probablemente sea una forma muy mala ya que es Un interno).
Respuestas de HYRY y Marius en comentarios!
Uno puede comprobar ya sea por:
probar la equivalencia del atributo
values.base
lugar del atributo devalues
, como en:df.values.base is df2.values.base
lugar dedf.values is df2.values
.- o usando el atributo
_is_view
(admitido internamente) (df2._is_view
esTrue
).
¡Gracias a todos!