Sono confuso riguardo alle regole che Pandas usa quando decide che una selezione da un dataframe è una copia del dataframe originale o una vista sull'originale.
Se ho, ad esempio,
df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))
Capisco che a query
restituisce una copia in modo che qualcosa di simile
foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40
non avrà alcun effetto sul dataframe originale, df
. Capisco anche che le sezioni scalari o denominate restituiscono una vista, in modo che le assegnazioni a queste, come
df.iloc[3] = 70
o
df.ix[1,'B':'E'] = 222
cambierà df
. Ma sono perso quando si tratta di casi più complicati. Per esempio,
df[df.C <= df.B] = 7654321
cambia df
, ma
df[df.C <= df.B].ix[:,'B':'E']
non.
C'è una semplice regola che Panda sta usando che mi manca solo? Cosa sta succedendo in questi casi specifici; e in particolare, come faccio a modificare tutti i valori (o un sottoinsieme di valori) in un dataframe che soddisfano una particolare query (come sto tentando di fare nell'ultimo esempio sopra)?
Nota: questa non è la stessa di questa domanda ; e ho letto la documentazione , ma non ne sono illuminato. Ho anche letto le domande "correlate" su questo argomento, ma mi manca ancora la semplice regola utilizzata da Panda e come la applicherei, ad esempio, per modificare i valori (o un sottoinsieme di valori) in un dataframe che soddisfa una particolare query.
.query
restituirà SEMPRE una copia a causa di ciò che sta facendo (e non una vista), perché è valutata da n numexpr. Quindi lo aggiungerò alle "regole"