python pandas dataframe indexing chained-assignment

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 esto

  • Un 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 por numexpr )

  • 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.