2016-11-18 3 views
0

Je suis en train de remplacer toutes les valeurs dans une colonne de dataframe de pandas géants df.column_Asi elles tombent dans la plage de 1 à 10.Comment modifier des valeurs de cellule spécifiques dans une série de colonnes de données pandas en fonction de plusieurs conditions?

Cependant, quand je fais:

df.loc[(1 < df.column_A < 10), "Column_A"] = 1,

Je cède:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Sinon, quand je fais:

df.loc[(df.column_A < 10) & (df.column_A > 1), "df.column_A"] = 1,

Je cédais pas d'erreur du tout, mais les valeurs ne suis pas remplacé.

étrange est que quand je fais:

df.loc[(df.column_A < 10) | (df.column_A > 1), "df.column_A"] = 1,

toutes les valeurs df.column_A se remplacés par 1, comme je l'attendre. Cela signifie que la syntaxe de la ligne est correcte, donc l'erreur doit être due à certains facteurs que je ne comprends pas.

Qu'est-ce que je fais mal?

Répondre

1

C'est un problème simple. .loc prend des étiquettes d'index ou une liste booléenne/série. Donc, cela fonctionnera:

df.loc[(df.column_A < 10) & (df.column_A > 1), "column_A"] = 1 

Notez que j'ai enlevé df. de l'index de colonne lieu.


df.loc[(1 < df.column_A < 10), "Column_A"] = 1 

ne fonctionnera pas car l'opération (1 < df.column_A < 10) semble logique, mais tente de réduire de toute la série en une seule valeur. Et puisqu'il ne sait pas si vous voulez un and, or ou une autre combinaison, il soulève cette erreur.

df.loc[(df.column_A < 10) | (df.column_A > 1), "df.column_A"] = 1 

Cela ne devrait pas fonctionner non plus, car vous ne référencez pas correctement les colonnes. C'est marrant que vous n'obteniez aucune erreur. Peut-être que vous avez fait quelque chose dans votre programme plus tôt qui vous sauve ...