Für bestimmte Spalten von df
, wenn 80% der Spalte NAN
sind.
Was ist der einfachste Code, um solche Spalten zu löschen?
Sie können isnull
mit mean
für den Schwellenwert verwenden und dann Spalten mit boolean indexing
mit loc
entfernen (da Spalten entfernen), müssen Sie auch die Bedingung umkehren - also bedeutet <.8
, dass alle Spalten entfernt werden >=0.8
:
df = df.loc[:, df.isnull().mean() < .8]
Probe:
np.random.seed(100)
df = pd.DataFrame(np.random.random((100,5)), columns=list('ABCDE'))
df.loc[:80, 'A'] = np.nan
df.loc[:5, 'C'] = np.nan
df.loc[20:, 'D'] = np.nan
print (df.isnull().mean())
A 0.81
B 0.00
C 0.06
D 0.80
E 0.00
dtype: float64
df = df.loc[:, df.isnull().mean() < .8]
print (df.head())
B C E
0 0.278369 NaN 0.004719
1 0.670749 NaN 0.575093
2 0.209202 NaN 0.219697
3 0.811683 NaN 0.274074
4 0.940030 NaN 0.175410
Wenn Sie Spalten mit minimalen Werten entfernen möchten dropna
working Nice mit den Parametern thresh
und axis=1
für das Entfernen von Spalten:
np.random.seed(1997)
df = pd.DataFrame(np.random.choice([np.nan,1], p=(0.8,0.2),size=(10,10)))
print (df)
0 1 2 3 4 5 6 7 8 9
0 NaN NaN NaN 1.0 1.0 NaN NaN NaN NaN NaN
1 1.0 NaN 1.0 NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN 1.0 1.0 NaN NaN NaN
3 NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN 1.0 NaN NaN NaN 1.0
5 NaN NaN NaN 1.0 1.0 NaN NaN 1.0 NaN 1.0
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN
9 1.0 NaN NaN NaN 1.0 NaN NaN 1.0 NaN NaN
df1 = df.dropna(thresh=2, axis=1)
print (df1)
0 3 4 5 7 9
0 NaN 1.0 1.0 NaN NaN NaN
1 1.0 NaN NaN NaN NaN NaN
2 NaN NaN NaN 1.0 NaN NaN
3 NaN NaN 1.0 NaN NaN NaN
4 NaN NaN NaN 1.0 NaN 1.0
5 NaN 1.0 1.0 NaN 1.0 1.0
6 NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN 1.0 NaN
9 1.0 NaN 1.0 NaN 1.0 NaN
EDIT: Für nicht-boolesche Daten
Die Gesamtzahl der NaN-Einträge in einer Spalte muss weniger als 80% der gesamten Einträge betragen:
df = df.loc[:, df.isnull().sum() < 0.8*df.shape[0]]
Wie in den Kommentaren vorgeschlagen, können Sie die Anzahl der Vorkommen ermitteln, wenn Sie sum()
für einen Booleschen Test verwenden.
Code:
def get_nan_cols(df, nan_percent=0.8):
threshold = len(df.index) * nan_percent
return [c for c in df.columns if sum(df[c].isnull()) >= threshold]
Benutzt als:
del df[get_nan_cols(df, 0.8)]
df.dropna(thresh=np.int((100-percent_NA_cols_required)*(len(df.columns)/100)),inplace=True)
Grundsätzlich benötigt pd.dropna die Anzahl (int) von non_na-Spalten, die erforderlich sind, wenn diese Zeile entfernt werden soll.