c'est une question assez similaire à cette question mais avec une différence essentielle: je sélectionne les données que je souhaite modifier, non pas par son index, mais par certains critères.
Si les critères que j'applique renvoient une seule ligne, je m'attendrais à pouvoir définir facilement la valeur d'une certaine colonne de cette ligne, mais ma première tentative ne fonctionne pas:
>>> d = pd.DataFrame({'year':[2008,2008,2008,2008,2009,2009,2009,2009],
... 'flavour':['strawberry','strawberry','banana','banana',
... 'strawberry','strawberry','banana','banana'],
... 'day':['sat','Sun','sat','Sun','sat','Sun','sat','Sun'],
... 'sales':[10,12,22,23,11,13,23,24]})
>>> d
day flavour sales year
0 sat strawberry 10 2008
1 Sun strawberry 12 2008
2 sat banana 22 2008
3 Sun banana 23 2008
4 sat strawberry 11 2009
5 Sun strawberry 13 2009
6 sat banana 23 2009
7 Sun banana 24 2009
>>> d[d.sales==24]
day flavour sales year
7 Sun banana 24 2009
>>> d[d.sales==24].sales = 100
>>> d
day flavour sales year
0 sat strawberry 10 2008
1 Sun strawberry 12 2008
2 sat banana 22 2008
3 Sun banana 23 2008
4 sat strawberry 11 2009
5 Sun strawberry 13 2009
6 sat banana 23 2009
7 Sun banana 24 2009
Donc, plutôt que de fixer à 100 le nombre de ventes de bananes du dimanche 2009, rien ne se passe! Quelle est la meilleure façon de faire cela? Idéalement, la solution devrait utiliser le numéro de ligne, car vous ne le savez normalement pas à l'avance!
Merci d'avance, Rob
De nombreuses façons de le faire
In [7]: d.sales[d.sales==24] = 100
In [8]: d
Out[8]:
day flavour sales year
0 sat strawberry 10 2008
1 Sun strawberry 12 2008
2 sat banana 22 2008
3 Sun banana 23 2008
4 sat strawberry 11 2009
5 Sun strawberry 13 2009
6 sat banana 23 2009
7 Sun banana 100 2009
In [26]: d.loc[d.sales == 12, 'sales'] = 99
In [27]: d
Out[27]:
day flavour sales year
0 sat strawberry 10 2008
1 Sun strawberry 99 2008
2 sat banana 22 2008
3 Sun banana 23 2008
4 sat strawberry 11 2009
5 Sun strawberry 13 2009
6 sat banana 23 2009
7 Sun banana 100 2009
In [28]: d.sales = d.sales.replace(23, 24)
In [29]: d
Out[29]:
day flavour sales year
0 sat strawberry 10 2008
1 Sun strawberry 99 2008
2 sat banana 22 2008
3 Sun banana 24 2008
4 sat strawberry 11 2009
5 Sun strawberry 13 2009
6 sat banana 24 2009
7 Sun banana 100 2009
Pas sûr de la version précédente des pandas, mais en 0.16, la valeur d'une cellule particulière peut être définie en fonction de plusieurs valeurs de colonne.
En étendant la réponse fournie par @waitingkuo, la même opération peut également être effectuée en fonction des valeurs de plusieurs colonnes.
d.loc[(d.day== 'Sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100
Vieille question, mais je suis surpris que personne n'ait mentionné la fonctionnalité .where()
de numpy (qui peut être appelée directement depuis le module pandas).
Dans ce cas, le code serait:
d.sales = pd.np.where(d.sales == 24, 100, d.sales)
À ma connaissance, il s’agit de l’un des moyens les plus rapides de modifier conditionnellement les données d’une série.