web-dev-qa-db-fra.com

Pandas SettingWithCopyWarning

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é.

22
ba_ul

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
39
Paul H

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)
5
koelemay