subplot python
¿Qué reglas usa Pandas para generar una vista frente a una copia? (1)
Aquí están las reglas, anulación posterior:
Todas las operaciones generan una copia
Si
inplace=True
se proporciona, se modificará in situ; solo algunas operaciones apoyan estoUn indizador que se establece, por ejemplo,
.loc/.ix/.iloc/.iat/.at
se establecerá en su lugar.Un indexador que obtiene un objeto con un solo tilde casi siempre es una vista (dependiendo del diseño de la memoria, puede que no sea así, por eso no es confiable). Esto es principalmente por eficiencia. (el ejemplo de arriba es para
.query
; esto siempre devolverá una copia como su evaluado pornumexpr
)Un indexador que se mete en un objeto con múltiples tipados siempre es una copia.
Tu ejemplo de chained indexing
df[df.C <= df.B].ix[:,''B'':''E'']
no se garantiza que funcione (y así nunca deberías hacer esto).
En lugar de hacer:
df.ix[df.C <= df.B, ''B'':''E'']
ya que esto es más rápido y siempre funcionará
La indexación encadenada es de 2 operaciones Python separadas y, por lo tanto, no puede ser interceptada de manera confiable por los pandas (a menudo se obtiene un SettingWithCopyWarning
, pero tampoco es 100% detectable). Los documentos de desarrollo , que señaló, ofrecen una explicación mucho más completa.
Estoy confundido acerca de las reglas que usa Pandas cuando decide que una selección de un marco de datos es una copia del marco de datos original, o una vista del original.
Si tengo, por ejemplo,
df = pd.DataFrame(np.random.randn(8,8), columns=list(''ABCDEFGH''), index=range(1,9))
Entiendo que una query
devuelve una copia para que algo así como
foo = df.query(''2 < index <= 5'')
foo.loc[:,''E''] = 40
no tendrá ningún efecto en el marco de datos original, df
. También entiendo que las secciones escalares o con nombre devuelven una vista, de modo que las asignaciones a estas, como
df.iloc[3] = 70
o
df.ix[1,''B'':''E''] = 222
cambiará df
. Pero estoy perdido cuando se trata de casos más complicados. Por ejemplo,
df[df.C <= df.B] = 7654321
cambia df
, pero
df[df.C <= df.B].ix[:,''B'':''E'']
no.
¿Hay alguna regla simple que esté usando Pandas que me estoy perdiendo? Qué está pasando en estos casos específicos; y, en particular, ¿cómo puedo cambiar todos los valores (o un subconjunto de valores) en un marco de datos que satisfaga una consulta en particular (como estoy intentando hacer en el último ejemplo anterior)?
Nota: Esto no es lo mismo que esta pregunta ; y he leído la documentación , pero no estoy iluminado por ella. También leí las preguntas "relacionadas" sobre este tema, pero todavía me falta la regla simple que usa Pandas, y cómo la aplicaría, por ejemplo, para modificar los valores (o un subconjunto de valores) en un marco de datos que satisfaga una consulta particular.