2 votes

Supprimer les colonnes contenant plus de N NaN consécutifs.

J'ai un DataFrame avec environ 1000 colonnes, certaines colonnes ont 0 NaNs, d'autres 3, d'autres 400.

Ce que je veux faire, c'est supprimer toutes les colonnes où il existe un nombre de NaN consécutifs supérieur à un certain seuil N, le reste étant imputé en prenant la moyenne des voisins les plus proches.

df

ColA | ColB | ColC  | ColD | ColE
NaN     5      3      NaN    NaN
NaN     6     NaN      4      4 
NaN     7      4       4      4 
NaN     5      5      NaN    NaN
NaN     5      4      NaN     4
NaN     3      3      NaN     3

threshold = 2

remove_consecutive_nan(df,threshold)

Ce qui donnerait

ColB | ColC | ColE
 5      3     NaN
 6     NaN     4
 7      4      4
 5      5     NaN
 5      4      4
 3      3      3

Comment dois-je écrire le remove_consecutive_nan fonction ?

1voto

jezrael Points 290608

Vous pouvez créer des groupes pour chaque colonne de mêmes valeurs pour les valeurs manquantes consécutives, puis compter chaque colonne séparément et enfin filtrer les colonnes par threshold :

def remove_consecutive_nan(df,threshold):
    m = df.notna()
    mask = m.cumsum().mask(m).apply(pd.Series.value_counts).gt(threshold)
    return df.loc[:, ~mask.any(axis=0)]

print (remove_consecutive_nan(df, 2))

   ColB  ColC  ColE
0     5   3.0   NaN
1     6   NaN   4.0
2     7   4.0   4.0
3     5   5.0   NaN
4     5   4.0   4.0
5     3   3.0   3.0

Alternative avec comptage des valeurs manquantes par plage :

def remove_consecutive_nan(df,threshold):
    m = df.isna()
    b = m.cumsum()
    mask = b.sub(b.mask(m).ffill().fillna(0)).gt(threshold)
    return df.loc[:, ~mask.any(axis=0)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X