python - ¿Cómo soltar la columna según el porcentaje NAN para el marco de datos?
pandas dataframe (3)
Como se sugiere en los comentarios, si usa
sum()
en una prueba booleana, puede obtener el número de ocurrencias.
Código:
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]
Usado como:
del df[get_nan_cols(df, 0.8)]
Para ciertas columnas de
df
, si el 80% de la columna es
NAN
.
¿Cuál es el código más simple para soltar esas columnas?
Puede usar
isnull
con
mean
para umbral y luego eliminar columnas mediante
boolean indexing
con
loc
(porque eliminar columnas), también necesita la condición invertida, por lo que
<.8
significa eliminar todas las columnas
>=0.8
:
df = df.loc[:, df.isnull().mean() < .8]
Muestra:
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
Si desea eliminar columnas por valores mínimos,
dropna
funciona bien con el parámetro
thresh
y
axis=1
para eliminar columnas:
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
EDITAR: para datos no booleanos
El número total de entradas de NaN en una columna debe ser inferior al 80% del total de entradas:
df = df.loc[:, df.isnull().sum() < 0.8*df.shape[0]]
df.dropna(thresh=np.int((100-percent_NA_cols_required)*(len(df.columns)/100)),inplace=True)
Básicamente, pd.dropna toma el número (int) de non_na cols necesarios si se va a eliminar esa fila.