Python 3.4 et Pandas 0.15.0
df est une trame de données et col1 est une colonne. Avec le code ci-dessous, je vérifie la présence de la valeur 10 et remplace ces valeurs par 1000.
df.col1[df.col1 == 10] = 1000
Voici un autre exemple. Cette fois, je modifie les valeurs de col2 en fonction de l'index.
df.col2[df.index == 151] = 500
Les deux produisent l'avertissement ci-dessous:
-c:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
Finalement,
cols = ['col1', 'col2', 'col3']
df[cols] = df[cols].applymap(some_function)
Cela produit un avertissement similaire, avec une suggestion supplémentaire:
Try using .loc[row_indexer,col_indexer] = value instead
Je ne suis pas sûr de comprendre la discussion pointée dans les avertissements. Quelle serait une meilleure façon d'écrire ces trois lignes de code?
Notez que les opérations ont fonctionné.
Le problème ici est que: df.col1[df.col1 == 10]
renvoie une copie.
Je dirais donc:
row_index = df.col1 == 10
# then with the form .loc[row_indexer,col_indexer]
df.loc[row_index, 'col1'] = 100
D'accord avec Paul sur l'utilisation de "loc".
Pour votre cas d'application de carte, vous devriez pouvoir faire ceci:
cols = ['col1', 'col2', 'col3']
df.loc[:, cols] = df[cols].applymap(some_function)