FutureWarning: elementwise comparaison a échoué; retour scalaire, mais à l'avenir sera d'effectuer elementwise comparaison
Je suis en utilisant les Pandas 0.19.1
sur Python 3. Je reçois un avertissement sur ces lignes de code. J'essaie de faire une liste qui contient tous les numéros de ligne où la chaîne Peter
est présent au niveau de la colonne Unnamed: 5
.
df = pd.read_excel(xls_path)
myRows = df[df['Unnamed: 5'] == 'Peter'].index.tolist()
Avertissement:
"\Python36\lib\site-packages\pandas\core\ops.py:792: FutureWarning: elementwise
comparison failed; returning scalar, but in the future will perform
elementwise comparison
result = getattr(x, name)(y)"
Qu'est-ce que ce FutureWarning et dois-je l'ignorer car il semble fonctionner.
Vous devez fournir des données de l'exemple.
OriginalL'auteur Arturo | 2016-11-17
Vous devez vous connecter pour publier un commentaire.
Ce FutureWarning n'est pas de Pandas, c'est à partir de numpy et le problème affecte aussi matplotlib et autres, voici comment reproduire l'avertissement plus près de la source du problème:
Une autre façon de reproduire ce bogue en utilisant le double est égal à l'opérateur:
Un exemple de Matplotlib touchés par cette FutureWarning sous leur carquois de la parcelle mise en œuvre: https://matplotlib.org/examples/pylab_examples/quiver_demo.html
Ce qui se passe ici?
Il y a un désaccord entre Numpy et natif de python sur ce qui devrait se produire lorsque vous comparez une des chaînes de numpy de types numériques. Avis de l'opérande de gauche est python de gazon, une primitive de la chaîne, et le moyen de l'opération est python gazon, mais l'opérande de droite est numpy du gazon. Si vous devez renvoyer un Python de style Scalaire ou un Numpy style ndarray de booléens? Numpy dit ndarray de bool, Pythonic les développeurs sont en désaccord. Classique de l'impasse.
Devrait-il être elementwise comparaison ou Scalaire si l'élément existe dans le tableau?
Si votre code ou de la bibliothèque est à l'aide de la
in
ou==
opérateurs de comparer python chaîne de numpy ndarrays, ils ne sont pas compatibles, donc si vous l'essayez, il retourne un scalaire, mais uniquement pour l'instant. Le message d'Avertissement indique que dans l'avenir ce comportement peut changer de sorte que votre code dégueule partout dans le tapis si python/numpy décider de faire adopter Numpy style.Soumis les rapports de Bug:
Numpy et Python sont dans une impasse, pour l'instant, l'opération retourne un scalaire, mais dans l'avenir, il peut changer.
https://github.com/numpy/numpy/issues/6784
https://github.com/pandas-dev/pandas/issues/7830
Deux solutions:
Soit de verrouillage de votre version de python et de numpy et d'ignorer les mises en garde, ou de garder des enfants à votre gauche et à droite des opérandes d'une commune de gazon.
Supprimer l'avertissement à l'échelle mondiale:
Supprimer l'avertissement sur ligne par ligne.
Juste supprimer l'avertissement par nom, puis mettre un commentaire fort à côté de mentionner la version actuelle de python et de numpy, en disant: ce code est fragile et a besoin de ces versions et de mettre un lien ici. Kick the can en bas de la route.
thing
(qui peut ou peut ne pas être un numpy type; je ne sais pas) et je veux voir sithing == 'some string'
et obtenir un simplebool
résultat, que dois-je faire?np.atleast_1d(thing)[0] == 'some string'
? Mais ce n'est pas robuste à un petit rigolo de mettre'some string'
dans le premier élément d'un tableau. Je suppose que je dois tester le type dething
abord, puis seulement les==
test si c'est une chaîne (ou pas une numpy objet).Il vous faudra alors passer votre propre style C ou Java style de la vérification de type wrapper code sur chaque ligne afin de s'assurer que
==
etin
fonctionnera comme vous vous attendez via python de l'effondrement de l'idéologie ou de numpy est vectorisé idéologie. Python Développeurs ont été averti à ce sujet, mais vous n'écoutez pas, maintenant vous payez le prix avec double d'égal à égal etin
exécution d'un comportement non défini lorsque vous avez accidentellement passer une coutumenumpy.googah.blimflarg
type dans une pandas fonction attend unpandas.vehicle.subspaceresponder
type. Au lieu de vous remettre un bon type d'erreur comme Java/C, c'est juste dégueule partout dans le tapis.Jusqu'à présent, il semble que je vais sortir avec
str(thing) == 'some string'
pour ce cas précis. Il semble que cela pourrait être un énorme gaspillage de temps si j'avais un plus grand ensemble de données à comparer.Cette stackoverflow post est un exemple de Python idéologie du "cow-boy duct-tape de programmation: Code rapide, ne faites pas de test de régression, de faire des erreurs, à casser des choses, apprendre, puis le fixer, puis répéter". Dans d'autres, plus rapide et plus sensible des langages tels que C++ et Java, ce problème n'aurait jamais été un problème parce que les types sont clouées et garantie au moment de la compilation, plutôt que d'être autorisés à prendre de un milliard de formes, et de flotter dans l'atmosphère de chaos complet. Je prie de ne pas modifier le contrat plus loin: youtube.com/watch?v=WpE_xMRiCLE
En fait, ce futur avertissement est également déclenché chaque fois que vous essayez de comparer un numpy.ndarray avec une liste vide. Par exemple, l'exécution
np.array([1, 2]) == []
sera d'amasser de l'avertissement.OriginalL'auteur Eric Leschinski
Mon expérience pour le même message d'avertissement a été causé par TypeError.
Donc, vous voudrez peut-être vérifier le type de données de la
Unnamed: 5
Ici est de savoir comment je peux reproduire le message d'avertissement:
Espère que cela aide.
df['num3'] == '3'
.OriginalL'auteur yhd.leung
Je reçois la même erreur lorsque je tente de régler le
index_col
la lecture d'un fichier dans unPanda
de données de l '-cadre:Je n'ai jamais rencontré une telle erreur précédemment. Je suis encore à essayer de comprendre la raison derrière cela (à l'aide de @Eric Leschinski explication et autres).
De toute façon, l'approche suivante résout le problème pour l'instant jusqu'à ce que je figure la raison:
Je mettrai à jour dès que je figure sur la raison d'un tel comportement.
read_csv()
. Me semble quelque chose quipandas
doit fixer.OriginalL'auteur Dataman
Si vos tableaux ne sont pas trop gros ou que vous n'en avez trop plusieurs d'entre eux, vous pourriez être en mesure de s'en tirer avec forçant le côté gauche de
==
être une chaîne de caractères:Mais c'est environ 1,5 fois plus lent si
df['Unnamed: 5']
est une chaîne de caractères, de 25 à 30 fois plus lent sidf['Unnamed: 5']
est un petit tableau numpy (longueur = 10), et de 150 à 160 fois plus lent si c'est un tableau numpy avec une longueur de 100 fois (en moyenne plus de 500 essais).Résultat:
OriginalL'auteur EL_DON
Une rapide solution pour cela est d'utiliser
numpy.core.defchararray
. J'ai aussi été confronté au même message d'avertissement et a été en mesure de le résoudre à l'aide de dessus du module.OriginalL'auteur Jeet23