Je ne comprends pas les règles que Pandas utilise pour décider qu'une sélection à partir d'un dataframe est une copie du dataframe original, ou une vue sur l'original.
Si j'ai, par exemple,
df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))
Je comprends que a query
renvoie une copie de sorte que quelque chose comme
foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40
n'aura aucun effet sur le dataframe d'origine, df
. Je comprends également que les tranches scalaires ou nommées renvoient une vue, de sorte que les affectations à celles-ci, telles que
df.iloc[3] = 70
ou
df.ix[1,'B':'E'] = 222
changera df
. Mais je suis perdu quand il s'agit de cas plus compliqués. Par exemple,
df[df.C <= df.B] = 7654321
changements df
, mais
df[df.C <= df.B].ix[:,'B':'E']
ne fait pas.
Existe-t-il une règle simple que Pandas utilise et qui me manque tout simplement? Que se passe-t-il dans ces cas spécifiques? et en particulier, comment changer toutes les valeurs (ou un sous-ensemble de valeurs) dans un dataframe qui satisfont une requête particulière (comme j'essaye de le faire dans le dernier exemple ci-dessus)?
Remarque: ce n'est pas la même chose que cette question ; et j'ai lu la documentation , mais je ne suis pas éclairé par elle. J'ai également lu les questions "connexes" sur ce sujet, mais il me manque toujours la règle simple que Pandas utilise et comment je l'appliquerais, par exemple, pour modifier les valeurs (ou un sous-ensemble de valeurs) dans une trame de données qui satisfont une requête particulière.
.query
retournera TOUJOURS une copie à cause de ce qu'il fait (et non d'une vue), car il est évalué par n numexpr. Je vais donc ajouter cela aux `` règles ''