python pandas dataframe nan

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.