tutorial tablas seleccionar para notebook leer hacer graficar funciones filtrar espaƱol datos con como columnas python pandas chained-assignment

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 de values , como en:

    df.values.base is df2.values.base lugar de df.values is df2.values .

  • o usando el atributo _is_view (admitido internamente) ( df2._is_view es True ).

¡Gracias a todos!