Estou confuso sobre as regras que o Pandas usa ao decidir que uma seleção de um dataframe é uma cópia do dataframe original ou uma visualização do original.
Se eu tenho, por exemplo,
df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))
Eu entendo que a query
devolve uma cópia para que algo como
foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40
não terá nenhum efeito sobre a trama de dados original, df
. Eu também entendo que fatias escalares ou nomeadas retornam uma visualização, de modo que as atribuições a elas, como
df.iloc[3] = 70
ou
df.ix[1,'B':'E'] = 222
vai mudar df
. Mas estou perdido quando se trata de casos mais complicados. Por exemplo,
df[df.C <= df.B] = 7654321
mudanças df
, mas
df[df.C <= df.B].ix[:,'B':'E']
não.
Existe uma regra simples que o Pandas está usando e que estou perdendo? O que está acontecendo nesses casos específicos; e, em particular, como altero todos os valores (ou um subconjunto de valores) em um dataframe que satisfaça uma consulta específica (como estou tentando fazer no último exemplo acima)?
Nota: Esta não é a mesma questão ; e eu li a documentação , mas não fui esclarecido por ela. Eu também li as questões "Relacionadas" neste tópico, mas ainda estou perdendo a regra simples que o Pandas está usando e como eu a aplicaria para - por exemplo - modificar os valores (ou um subconjunto de valores) em um dataframe que satisfaça uma consulta específica.
.query
SEMPRE retornará uma cópia por causa do que está fazendo (e não uma visão), porque é avaliada por n numexpr. Então, vou adicionar isso às 'regras'