Ich möchte die Anzahl der NaN
-Werte in jeder Spalte meiner Daten finden.
Antworten
Zu viele Anzeigen?Ein weiterer Weg nur zur Vollständigkeit ist die Verwendung von np.count_nonzero
mit .isna():
np.count_nonzero(df.isna())
%timeit np.count_nonzero(df.isna())
512 ms ± 24.7 ms pro Durchlauf (mean ± std. dev. von 7 Durchläufen, 1 loop each)
Vergleich mit den Top-Antworten bei Verwendung eines Dataframes mit 1000005 Zeilen × 16 Spalten:
%timeit df.isna().sum()
492 ms ± 55.2 ms pro Durchlauf (mean ± std. dev. von 7 Durchläufen, 1 loop each)
%timeit df.isnull().sum(axis = 0)
478 ms ± 34.9 ms pro Durchlauf (mean ± std. dev. von 7 Durchläufen, 1 loop each)
%timeit count_nan = len(df) - df.count()
484 ms ± 47.4 ms pro Durchlauf (mean ± std. dev. von 7 Durchläufen, 1 loop each)
Daten:
rohdaten = {'Vorname': ['Jason', np.nan, 'Tina', 'Jake', 'Amy'],
'Nachname': ['Miller', np.nan, np.nan, 'Milner', 'Cooze'],
'Alter': [22, np.nan, 23, 24, 25],
'Geschlecht': ['m', np.nan, 'f', 'm', 'f'],
'Test1_Ergebnis': [4, np.nan, 0, 0, 0],
'Test2_Ergebnis': [25, np.nan, np.nan, 0, 0]}
ergebnisse = pd.DataFrame(rohdaten, columns = ['Vorname', 'Nachname', 'Alter', 'Geschlecht', 'Test1_Ergebnis', 'Test2_Ergebnis'])
# großer Dataframe für %timeit
groß_df = pd.DataFrame(np.random.randint(0, 100, size=(1000000, 10)), columns=list('ABCDEFGHIJ'))
df = pd.concat([groß_df,ergebnisse]) # 1000005 Zeilen × 16 Spalten
Ich habe eine kurze Funktion (Python 3) geschrieben, um .info als ein Pandas-Dataframe zu erstellen, das dann in Excel geschrieben werden kann:
df1 = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})
def info_as_df (df):
null_counts = df.isna().sum()
info_df = pd.DataFrame(list(zip(null_counts.index,null_counts.values))\
, columns = ['Spalte', 'Nullwerte_Zähler'])
data_types = df.dtypes
info_df['Datentyp'] = data_types.values
return info_df
print(df1.info())
print(info_as_df(df1))
Das ergibt:
RangeIndex: 3 Einträge, 0 bis 2
Data columns (total 2 columns):
# Spalte Non-Null Count Datentyp
--- ------ -------------- -----
0 a 2 non-null float64
1 b 1 non-null float64
dtypes: float64(2)
memory usage: 176.0 bytes
None
Spalte Nullwerte_Zähler Datentyp
0 a 1 float64
1 b 2 float64
Ich habe die von @sushmit vorgeschlagene Lösung in meinem Code verwendet.
Eine mögliche Variation davon könnte auch sein
colNullCnt = []
for z in range(len(df1.cols)):
colNullCnt.append([df1.cols[z], sum(pd.isnull(trainPd[df1.cols[z]]))])
Der Vorteil davon ist, dass es das Ergebnis für jede der Spalten im df zurückgibt.
Angenommen, Sie möchten die Anzahl der fehlenden Werte (NaN) in einer Spalte (Serie) namens Preis in einem Datenrahmen namens Bewertungen erhalten
#das Datenrahmen importieren
import pandas as pd
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
Um die fehlenden Werte zu erhalten, mit n_missing_prices als Variable, einfach tun
n_missing_prices = sum(reviews.price.isnull())
print(n_missing_prices)
sum ist die Schlüsselmethode hier, ich habe versucht, count zu verwenden, bevor ich bemerkt habe, dass sum die richtige Methode in diesem Kontext ist
import pandas as pd
import numpy as np
# Beispiel DataFrame
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})
# Anzahl der NaNs in einer Spalte zählen
num_nan_a = df.loc[ (pd.isna(df['a'])) , 'a' ].shape[0]
num_nan_b = df.loc[ (pd.isna(df['b'])) , 'b' ].shape[0]
# Zusammenfassung der num_nan_b
print(df)
print(' ')
print(f"Es gibt {num_nan_a} NaNs in der Spalte a")
print(f"Es gibt {num_nan_b} NaNs in der Spalte b")
Gibt als Ausgabe folgendes:
a b
0 1.0 NaN
1 2.0 1.0
2 NaN NaN
Es gibt 1 NaNs in der Spalte a
Es gibt 2 NaNs in der Spalte b