Estoy confundido acerca de las reglas que usa Pandas al decidir 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 query
devuelve una copia para que algo como
foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40
no tendrá ningún efecto sobre la trama de datos original, df
. También entiendo que los segmentos escalares o con nombre devuelven una vista, de modo que las asignaciones a estos, 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
cambios df
, pero
df[df.C <= df.B].ix[:,'B':'E']
no.
¿Existe una regla simple que utiliza Pandas y que me falta? ¿Qué está pasando en estos casos específicos? y, en particular, ¿cómo cambio todos los valores (o un subconjunto de valores) en un marco de datos que satisface una consulta en particular (como intento hacer en el último ejemplo anterior)?
Nota: No es lo mismo que esta pregunta ; y he leído la documentación , pero no me iluminó. 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, a modificar los valores (o un subconjunto de valores) en un marco de datos que satisfaga una consulta en particular.
.query
SIEMPRE devolverá una copia debido a lo que está haciendo (y no una vista), porque es evaluado por n numexpr. Así que agregaré eso a las 'reglas'