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 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 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 22731 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2024 1 477
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".

0
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
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

0