1
votes

Comment trouver le premier élément non nul et le dernier élément non nul et le couper

J'ai un pandas Df avec 1,2 million de lignes * 10 colonnes.

Par exemple, mon DF ressemble à

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:

Ma condition

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 ????


0 commentaires

3 Réponses :


3
votes

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


0 commentaires

1
votes

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


0 commentaires

1
votes

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


2 commentaires

Bien, first_valid_index est une bonne option. +1 :)


@ anky_91 Merci. J'apprécie le commentaire.