J'ai créé un DataFrame Pandas.
df = DataFrame(index=['A','B','C'], columns=['x','y'])
et j'ai obtenu ceci
x y A NaN NaN B NaN NaN C NaN NaN
x y A NaN NaN B NaN NaN C 10 NaN
avec ce code :
df.xs('C')['x'] = 10
mais le contenu de df
n'a pas changé. Il n'y a encore que des NaN
s dans le DataFrame.
Avez-vous des suggestions ?
La réponse de RukTech, df.set_value('C' ;, 'x' ;, 10)
, est de loin plus rapide que les options que je propose ci-dessous. Cependant, elle a été [slated for deprecation] (https://github.com/pandas-dev/pandas/issues/15269).
À l'avenir, la méthode recommandée est .iat/.at
.
Pourquoi df.xs('C' ;)['x' ;]=10
ne fonctionne pas:
df.xs('C' ;)
par défaut, renvoie un nouveau cadre de données [avec une copie][2] des données, donc
df.xs('C')['x']=10
ne modifie que ce nouveau cadre de données.
df['x' ;]
renvoie une vue du cadre de données df
, donc
df['x']['C'] = 10
modifie df
lui-même.
Avertissement : Il est parfois difficile de prévoir si une opération retourne une copie ou une vue. Pour cette raison, la [docs recommande d'éviter les assignations avec "chained indexing" ;][1].
L'alternative recommandée est donc
df.at['C', 'x'] = 10
qui modifie df
.
In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop
In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop
In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
[1] : http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy [2] : http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.xs.html#pandas.DataFrame.xsY
Mise à jour : La méthode .set_value
va être [dépréciée][2]. .iat/.at
sont de bons remplacements, malheureusement pandas fournit peu de documentation.
La façon la plus rapide de faire cela est d'utiliser [set_value][1]. Cette méthode est ~100 fois plus rapide que la méthode .ix
. Par exemple :
df.set_value('C' ;, 'x' ;, 10)
[1] : http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_value.html [2] : https://github.com/pandas-dev/pandas/issues/15269
La méthode recommandée (selon les responsables) pour définir une valeur est la suivante :
df.ix['x','C']=10
L'utilisation de l'indexation chaînée (df['x' ;]['C' ;]
) peut entraîner des problèmes.
Voir :