Erreur : either both or neither of x and y should be given

Résolu/Fermé
gigi123 - Modifié le 5 août 2022 à 14:23
mamiemando Messages postés 33199 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 juillet 2024 - 5 août 2022 à 14:33

Bonjour,

Après avoir écris cette ligne :

df['Result']=np.where(df['Libellé']==df['Catalogue urnes'],df['Consommables'])

J'obtiens donc cette erreur :

either both or neither of x and y should be given

A savoir : les colonnes libellé, catalogue urnes et consommables sont de type string et ne dispose pas le même nombre de ligne.

Ce que je veux : si la colonne libellé et égale = la colonne catalogue urnes , alors dans la colonne que je veux crée (result), j'inscris ce qu'il est noté dans la colonne consommable

Merci à vous

2 réponses

yg_be Messages postés 22997 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 juillet 2024 1 496
26 juil. 2022 à 12:54

bonjour,

Te pense que le message d'erreur t'indique qu'il manque un paramètre.

Dans ton explication, tu écris "si ..., alors ...".  Il manque le "sinon".

mamiemando Messages postés 33199 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 juillet 2024 7 763
Modifié le 5 août 2022 à 14:37

Bonjour,

Explication de l'erreur

L'erreur vient de np.where qui s'utilise de deux manières possibles :

  • soit tu donnes juste un paramètre, et la valeur retournée correspond à la zone conservée par np.where :
import numpy as np

a = np.arange(10)
b = np.where(a < 5)[0]
print(b) # [0, 1, 2, 3, 4]
  • soit tu donnes trois paramètres (condition, x, y) : si la condition est vraie, alors les données retournées sont prises depuis x, sinon depuis y.
import numpy as np

a = np.arange(10)
b = np.arange(100, 110)
c = np.arange(200, 210)
d = np.where(a % 2 == 0, b, c)
print(d) # [100 201 102 203 104 205 106 207 108 209]

Comme tu n'es dans aucun de ces deux cas, np.where te dit que tu ne l'as pas appelé avec un nombre de paramètre valide.

Retour à ton problème

Ce que je veux : si la colonne libellé et égale = la colonne catalogue urnes , alors dans la colonne que je veux crée (result), j'inscris ce qu'il est noté dans la colonne consommable

Il te faut donc utiliser la version à trois paramètres. Dans le code que tu proposes, tu ne spécifies pas comment doit être rempli df["Result"] si la condition n'est pas vérifiée, d'où l'erreur. Peut-être veux tu écrire :

df["Result"] = np.where(
    df["Libellé"] == df["Catalogue urnes"],
    df["Consommables"],
    df["Result"]
)

Bonne chance