Wie man den Fehler 'Cannot Mask with Non-Boolean Array Containing NA / NaN Values' behebt
Published on
Pandas, eine für die Programmiersprache Python entwickelte Software-Bibliothek, ist ein leistungsstarkes Werkzeug zur Datenmanipulation und -analyse. Allerdings hat es auch seine Eigenheiten. Eine solche Eigenheit, die Datenenthusiasten oft ins Schwitzen bringt, ist der Fehler 'kann mit nicht-booleschem Array mit NA / NaN-Werten nicht maskieren'. Dieser Fehler tritt in der Regel auf, wenn Sie versuchen, ein nicht-boolesches Array mit einem booleschen Array zu maskieren und Ihre Daten fehlende oder undefinierte Werte (NA oder NaN) enthalten.
In diesem Artikel werden wir uns mit der Ursache dieses Fehlers befassen, erklären, wie man ihn beheben kann, und alternative Möglichkeiten besprechen, das gleiche Ergebnis zu erzielen. Wir werden auch einige damit zusammenhängende Fragen beantworten, die oft im Zusammenhang mit diesem Fehler auftauchen. Also, ob Sie ein erfahrener Datenspezialist oder ein Anfänger sind, der gerade erst in die Welt von Pandas einsteigt, lesen Sie weiter, um dieses häufige Problem bei Pandas zu entmystifizieren.
Verständnis des Fehlers
Die Fehlermeldung "kann mit nicht-booleschem Array mit NA / NaN-Werten nicht maskieren" ist eine häufige Fehlermeldung, die beim Arbeiten mit Pandas auftritt. Sie wird ausgelöst, wenn Sie versuchen, die Funktion mask() auf einem nicht-booleschen Array anzuwenden, das NA- (Not Available) oder NaN- (Not a Number) Werte enthält.
In Pandas wird die Funktion mask() verwendet, um Werte zu ersetzen, bei denen die Bedingung wahr ist. Das Problem entsteht, wenn das Bedingungsarray nicht streng boolesch ist - das heißt, es enthält nicht nur True- und False-Werte. Wenn das Bedingungsarray NA- oder NaN-Werte enthält, ist Pandas verwirrt - es weiß nicht, ob es diese Werte als True oder False behandeln soll. Diese Unsicherheit führt zu dem genannten Fehler.
Betrachten wir zum Beispiel den folgenden Codeausschnitt:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan]})
mask = pd.array([True, False, np.nan])
df.A.mask(mask)
Dieser Code wirft den Fehler "kann mit nicht-booleschem Array mit NA / NaN-Werten nicht maskieren", weil das Maskenarray einen NaN-Wert enthält.
Behebung des Fehlers
Nun, da wir verstehen, was den Fehler auslöst, wollen wir uns ansehen, wie man ihn behebt. Die Lösung besteht darin, sicherzustellen, dass das an die Funktion mask() übergebene Bedingungsarray streng boolesch ist. Das können wir erreichen, indem wir die Funktionen isna() oder notna() verwenden, die von Pandas bereitgestellt werden.
Die Funktion isna() liefert ein boolesches Array, das an den Stellen True ist, wo das ursprüngliche Array NA- oder NaN-Werte hat, und sonst False. Die Funktion notna() macht das Gegenteil - sie liefert ein boolesches Array, das an den Stellen True ist, wo das ursprüngliche Array nicht-NA-Werte hat, und sonst False.
Hier sehen Sie, wie Sie diese Funktionen verwenden können, um den Fehler zu beheben:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan]})
mask = pd.array([True, False, np.nan])
# Konvertieren Sie die Maske in ein boolesches Array mit isna()
boolesche_maske = mask.isna()
df.A.mask(boolesche_maske)
Dieser Code wird ohne Fehler ausgeführt. Die Funktion mask() erhält nun ein streng boolesches Array und weiß genau, welche Werte ersetzt werden sollen.
Alternative Möglichkeiten, das gleiche Ergebnis zu erzielen
Obwohl es eine unkomplizierte Lösung ist, die Funktionen isna() oder notna() zu verwenden, um Ihr Bedingungsarray in ein boolesches Array umzuwandeln, gibt es alternative Möglichkeiten, das gleiche Ergebnis zu erzielen. Diese Alternativen können besonders nützlich sein, wenn Sie es mit komplexen Datenmanipulationsaufgaben zu tun haben.
Eine solche Alternative besteht darin, die Funktion where() anstelle der Funktion mask() zu verwenden. Die Funktion where() ist im Grunde das Gegenteil der Funktion mask() - sie ersetzt Werte, bei denen die Bedingung falsch ist. Das bedeutet, dass Sie die Funktion where() mit einem nicht-booleschen Bedingungsarray verwenden können, ohne dass ein Fehler auftritt.
Hier sehen Sie, wie Sie die Funktion where() verwenden können, um den Fehler "kann mit nicht-booleschem Array mit NA / NaN-Werten nicht maskieren" zu vermeiden:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan]})
mask = pd.array([True, False, np.nan])
df.A.where(mask)
Dieser Code wird ohne Fehler ausgeführt, obwohl das an die Funktion where() übergebene Bedingungsarray einen NaN-Wert enthält.
Eine weitere Alternative besteht darin, die Funktion fillna() zu verwenden, um die NA- oder NaN-Werte in Ihrem Bedingungsarray vor dem Übergeben an die Funktion mask() zu ersetzen. Die Funktion fillna() ermöglicht es Ihnen, einen Wert anzugeben, der die NA- oder NaN-Werte in Ihrem Array ersetzt.
Hier sehen Sie, wie Sie die Funktion fillna() verwenden können, um den Fehler zu vermeiden:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan]})
mask = pd.array([True, False, np.nan])
# Ersetzen Sie die NaN-Werte in der Maske durch False
mask = mask.fillna(False)
df.A.mask(mask)
Dieser Code wird ohne Fehler ausgeführt. Die Funktion mask() erhält nun ein streng boolesches Array und weiß genau, welche Werte ersetzt werden sollen.
Weitere häufige Fehler bei NA/NaN-Werten
Während wir dieses Thema weiter erforschen, wollen wir einige damit zusammenhängende Fragen beantworten, die oft im Zusammenhang mit dem Maskieren von NA- oder NaN-Werten in Pandas auftauchen.
Wie maskiert man NaN-Werte in Pandas?
Das Maskieren von NaN-Werten ist ähnlich wie das Maskieren von NA-Werten. Sie können die gleiche Kombination der Funktionen mask() und isna() verwenden:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, np.nan]})
# Ersetzen Sie NaN-Werte durch einen bestimmten Wert (z. B. 0)
df.A.mask(df.A.isna(), 0)
Wie maskiert man ein nicht-boolesches Array in Pandas?
Wenn Sie ein nicht-boolesches Array haben, das Sie als Maske verwenden möchten, müssen Sie es zuerst in ein boolesches Array umwandeln. Das können Sie mit der Funktion astype() tun:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1, 2, 3]})
mask = pd.array([1, 0, 1]) # Nicht-boolesches Array
mask = mask.astype(bool)
# Das nicht-boolsche Array in ein boolsches Array umwandeln
boolean_mask = mask.astype(bool)
df.A.mask(boolean_mask)
Fazit
Der Fehler "cannot mask with non-boolean array containing na / nan values" in pandas ist ein häufiges Hindernis für viele Datenenthusiasten. Jedoch können Sie mit einem klaren Verständnis für die Ursache dieses Fehlers und den richtigen Werkzeugen diese Hürde leicht überwinden. Egal, ob Sie die Funktionen isna() oder notna() verwenden, um Ihr Bedingungs-Array in ein boolsches Array umzuwandeln, oder alternative Methoden wie die Funktionen where() oder fillna() wählen, denken Sie daran, dass der Schlüssel darin besteht, sicherzustellen, dass das Bedingungs-Array, das an die mask() Funktion übergeben wird, streng boolsch ist.
Während Sie weiterhin mit pandas arbeiten, werden Sie wahrscheinlich auf andere Fehler und Ausnahmen stoßen. Lassen Sie sich jedoch nicht entmutigen. Jeder Fehler ist eine Gelegenheit, mehr über pandas zu lernen und Ihre Datenumwandlungsfähigkeiten zu verbessern. Also weiter erkunden, weiter experimentieren und weiter lernen.
Häufig gestellte Fragen
1. Was bedeutet der Fehler "cannot mask with non-boolean array containing na / nan values"?
Dieser Fehler tritt auf, wenn Sie die mask() Funktion in pandas mit einem nicht-boolschen Array verwenden, das NA- oder NaN-Werte enthält. Die mask() Funktion erwartet ein streng boolsches Array und wirft diesen Fehler aus, wenn sie NA- oder NaN-Werte im Bedingungs-Array findet.
2. Wie kann ich den Fehler "cannot mask with non-boolean array containing na / nan values" vermeiden?
Sie können diesen Fehler vermeiden, indem Sie sicherstellen, dass das Bedingungs-Array, das an die mask() Funktion übergeben wird, streng boolsch ist. Sie können die Funktionen isna() oder notna() verwenden, um Ihr Array in ein boolsches Array umzuwandeln. Alternativ können Sie die Funktionen where() oder fillna() verwenden, um NA- oder NaN-Werte in Ihrem Array zu behandeln.
3. Was ist der Unterschied zwischen den Funktionen mask() und where() in pandas?
Die Funktion mask() ersetzt Werte, bei denen die Bedingung True ist, während die Funktion where() Werte ersetzt, bei denen die Bedingung False ist. Das bedeutet, dass Sie die Funktion where() mit einem nicht-boolschen Bedingungs-Array verwenden können, und es wird keinen Fehler auslösen, im Gegensatz zur Funktion mask(). Beide Funktionen sind nützlich, um Werte in einem Array basierend auf einer Bedingung zu ersetzen.