Wie kann in Python Pandas am besten überprüft werden, ob ein DataFrame einen (oder mehrere) NaN-Werte hat?
Ich kenne die Funktion pd.isnan
, aber dies gibt einen DataFrame von Booleschen Werten für jedes Element zurück. Dieser Beitrag hier beantwortet auch meine Frage nicht genau.
Antworten:
Die Antwort von jwilner ist genau richtig . Ich habe untersucht, ob es eine schnellere Option gibt, da das Summieren von flachen Arrays meiner Erfahrung nach (seltsamerweise) schneller ist als das Zählen. Dieser Code scheint schneller zu sein:
Zum Beispiel:
df.isnull().sum().sum()
ist etwas langsamer, hat aber natürlich zusätzliche Informationen - die Anzahl derNaNs
.quelle
pandas
hierfür keine Funktion eingebaut ist. Es ist wahr, dass @ JGreenwells Post diesdf.describe()
kann, aber keine direkte Funktion.df.describe()
(ohneNaN
s zu finden). Bei einem 1000 x 1000-Array dauert ein einzelner Anruf 1,15 Sekunden.df.isnull().values.sum()
ist auch etwas schneller alsdf.isnull().values.flatten().sum()
.flatten()
für das Posting zu entfernen . Vielen Dank.df.isnull().values.any()
, für mich ist es schneller als die anderen.Sie haben mehrere Möglichkeiten.
Jetzt sieht der Datenrahmen ungefähr so aus:
df.isnull().any().any()
- Dies gibt einen booleschen Wert zurückSie wissen,
isnull()
welche einen Datenrahmen wie diesen zurückgeben würden:Wenn Sie es schaffen
df.isnull().any()
, können Sie nur die Spalten finden, dieNaN
Werte haben:Einer noch
.any()
wird Ihnen sagen, ob eine der oben genanntenTrue
df.isnull().sum().sum()
- Dies gibt eine Ganzzahl der Gesamtzahl derNaN
Werte zurück:Dies funktioniert genauso wie das
.any().any()
, indem zuerst eine Summe der Anzahl derNaN
Werte in einer Spalte und dann die Summe dieser Werte angegeben wird:Um die Gesamtzahl der NaN-Werte im DataFrame abzurufen:
quelle
.any(axis=None)
statt verwenden.any().any()
?So finden Sie heraus, welche Zeilen NaNs in einer bestimmten Spalte enthalten:
quelle
non_nan_rows = df[df['name column'].notnull()]
.Wenn Sie wissen müssen, wie viele Zeilen es mit "einem oder mehreren
NaN
s" gibt:Oder wenn Sie diese Zeilen herausziehen und untersuchen müssen:
quelle
df.isnull().any().any()
Sollte es tun.quelle
Ich bin sehr neu in Python und Pandas. Bitte weisen Sie darauf hin, wenn ich falsch liege.
So finden Sie heraus, welche Zeilen NaNs haben:
würde dieselbe Operation ausführen, ohne dass eine Transponierung erforderlich ist, indem die Achse von any () als 1 angegeben wird, um zu überprüfen, ob 'True' in Zeilen vorhanden ist.
quelle
any(axis=1)
Vereinfachung.Super einfache Syntax:
df.isna().any(axis=None)
Ab Version 0.23.2 können Sie
DataFrame.isna
+ verwenden,DataFrame.any(axis=None)
wobeiaxis=None
die logische Reduzierung über den gesamten DataFrame festgelegt wird.Nützliche Alternativen
numpy.isnan
Eine weitere performante Option, wenn Sie ältere Versionen von Pandas ausführen.
Alternativ können Sie die Summe überprüfen:
Series.hasnans
Sie können auch iterativ anrufen
Series.hasnans
. Um beispielsweise zu überprüfen, ob eine einzelne Spalte NaNs enthält,Und um zu überprüfen, ob eine Spalte NaNs enthält, können Sie ein Verständnis mit verwenden
any
(was eine Kurzschlussoperation ist).Das geht eigentlich sehr schnell.
quelle
Da keiner erwähnt hat, gibt es nur eine andere Variable, die aufgerufen wird
hasnans
.df[i].hasnans
wird ausgegeben,True
wenn einer oder mehrere der Werte in der Pandas-Serie NaN ist,False
wenn nicht. Beachten Sie, dass es keine Funktion ist.Pandas Version '0.19.2' und '0.20.2'
quelle
df = DataFrame([1,None], columns=['foo'])
, danndf.hasnans
wird ein werfenAttributeError
, aberdf.foo.hasnans
zurückkehrenTrue
.Da ich das
pandas
herausfinden mussDataFrame.dropna()
, habe ich mir angesehen, wie sie es implementieren, und festgestellt, dass sie es verwendet habenDataFrame.count()
, was alle Nicht-Null-Werte in der zähltDataFrame
. Vgl. Pandas Quellcode . Ich habe diese Technik nicht bewertet, aber ich glaube, die Autoren der Bibliothek haben wahrscheinlich eine kluge Entscheidung getroffen, wie sie dies tun soll.quelle
Sei
df
der Name des Pandas DataFrame und jeder Wert, dernumpy.nan
ein Nullwert ist.Wenn Sie den Prozentsatz der Nullen in jeder Spalte anzeigen möchten
df.loc[:,list(df.loc[:,df.isnull().any()].columns)].isnull().sum()/(len(df))*100
EDIT 1:
Wenn Sie sehen möchten, wo Ihre Daten visuell fehlen:
quelle
df.isna().sum()
?Verwenden Sie einfach math.isnan (x) , geben Sie True zurück, wenn x eine NaN (keine Zahl) ist, andernfalls False.
quelle
math.isnan(x)
es funktionieren wird, wennx
es sich um einen DataFrame handelt. Sie erhalten stattdessen einen TypeError.Auf diese Weise können Sie alle NaN-Werte zählen, die in den jeweiligen Spalten des DataFrame vorhanden sind.
quelle
Hier ist eine weitere interessante Möglichkeit, Null zu finden und durch einen berechneten Wert zu ersetzen
quelle
Ich habe Folgendes verwendet und es in einen String umgewandelt und nach dem Nanowert gesucht
Auf diese Weise kann ich einen bestimmten Wert in einer Serie überprüfen und nicht nur zurückgeben, wenn dieser irgendwo in der Serie enthalten ist.
quelle
pandas.isna()
?Das Beste wäre zu verwenden:
Hier ist warum . Wird
isna()
also zum Definieren verwendetisnull()
, aber beide sind natürlich identisch.Dies ist sogar schneller als die akzeptierte Antwort und deckt alle 2D-Panda-Arrays ab.
quelle
Oder Sie verwenden können ,
.info()
auf demDF
wie zum Beispiel:df.info(null_counts=True)
Dies gibt die Anzahl der nicht leeren Zeilen in einer Spalte zurück, wie z.quelle
quelle
Überprüft für jede Spalte, ob sie Nan enthält oder nicht.
quelle
Wir können die Nullwerte in dem Datensatz sehen durch Heatmap mit Seaborn Erzeugungsmodul Heatmap
quelle
Sie können nicht nur überprüfen, ob 'NaN' vorhanden ist, sondern auch den Prozentsatz der 'NaN' in jeder Spalte mithilfe der folgenden Angaben ermitteln:
quelle
Abhängig von der Art der Daten, mit denen Sie sich befassen, können Sie bei der Durchführung Ihrer EDA auch einfach die Wertanzahl jeder Spalte abrufen, indem Sie dropna auf False setzen.
Funktioniert gut für kategoriale Variablen, nicht so sehr, wenn Sie viele eindeutige Werte haben.
quelle