J'ai un pandas Df avec 1,2 million de lignes * 10 colonnes.
Index Time a b c
0 3 0.3 0 1.5
1 4 0 1 0
2 5 0 0 5
3 6 1 0 0
Je voudrais éliminer les lignes de la trame de données qui sont AVANT le premier index non nul de la colonne "a" ET APRÈS le dernier index non nul de la colonne "a". Dans le cas ci-dessus, les résultats devraient ressembler à ceci:
Index Time a b c 0 1 0 1 0 1 2 0 0 1 2 3 0.3 0 1.5 3 4 0 1 0 4 5 0 0 5 5 6 1 0 0 6 7 0 0 0 7 8 0 1 5
J'ai trouvé la même question postée Même exigence , mais là, il a utilisé R pour faire l'opération ... Comment puis-je le faire en python ????
3 Réponses :
Commencez par comparer la colonne a pour une valeur différente de ne , puis obtenez la somme cumulée, et comparez à nouveau, créez un autre masque par ordre de changement par [:: - 1] pour échange ordre et dernier filtre par indexation booléenne code> :
print (df) Time a b c 0 1 0 1 0 1 2 0 0 1 6 7 0 0 0 7 8 0 1 5 m = df['a'].ne(0) df = df[m.cumsum().ne(0) & m[::-1].cumsum().ne(0)] print (df) Empty DataFrame Columns: [Time, a, b, c] Index: []
La solution fonctionne bien si seulement 0 valeurs dans la colonne a:
m = df['a'].ne(0) df = df[m.cumsum().ne(0) & m[::-1].cumsum().ne(0)] print (df) Time a b c 2 3 0.3 0 1.5 3 4 0.0 1 0.0 4 5 0.0 0 5.0 5 6 1.0 0 0.0
Juste une autre méthode utilisant df.iloc[
m=df[df.a.ne(0)] df.iloc[m.index[0]:m.index[1]+1] Index Time a b c 2 2 3 0.3 0 1.5 3 3 4 0.0 1 0.0 4 4 5 0.0 0 5.0 5 5 6 1.0 0 0.0
Utilisons first_valid_index et last_valid_index avec mask:
Time a b c Index 2 3 0.3 0 1.5 3 4 0.0 1 0.0 4 5 0.0 0 5.0 5 6 1.0 0 0.0
Sortie:
XXX
Bien, first_valid_index est une bonne option. +1 :)
@ anky_91 Merci. J'apprécie le commentaire.