web-dev-qa-db-fra.com

Remplacer la valeur d'une cellule sélectionnée dans DataFrame pandas sans utiliser d'index

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

29
LondonRob

De nombreuses façons de le faire 

1

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

2

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

3

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
47
waitingkuo

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
8
ram

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.

0
elPastor