2017-10-18 2 views
2

J'ai un df comme ce qui est d'environ 1000 lignes:Sur tous les 7 rangs, obtenir les nième ligne pandas géants

 0  1 
0 1.345 2.456 
1 2.123 3.564 
2 0.023 3.548 
3 3.457 2.456 
4 1.754 3.564 
5 0.905 3.548 
6 3.674 7.543 
7 9.443 6.4433... 

La façon dont il est organisé est tous les 7 rangs constitue un « ensemble » de données (les données ne peuvent être trié ici). Dans chacun des « groupes » de 7 lignes que je veux obtenir la première ligne donc ma nouvelle trame de données ressemblerait à ceci:

 0  1 
0 1.345 2.456 
7 9.443 6.4433 

je peux le résoudre en créant une nouvelle colonne qui se répète 1-7 & filtrage par seule cette colonne ...

 0  1 groupby_col 
0 1.345 2.456  1 
1 2.123 3.564  2 
2 0.023 3.548  3 
3 3.457 2.456  4 
4 1.754 3.564  5 
5 0.905 3.548  6 
6 3.674 7.543  7 
7 9.443 6.4433  1... 

puis ...

df[df['groupby_col'] == 1] 

Est-il possible que je peux le faire en pandas géants sans avoir à créer une colonne supplémentaire puis filtrer?

Répondre

5

Option 1:

In [54]: df.iloc[::7] 
Out[54]: 
     0  1 
0 1.345 2.4560 
7 9.443 6.4433 

Option 2:

In [53]: df.iloc[np.arange(len(df))%7==0] 
Out[53]: 
     0  1 
0 1.345 2.4560 
7 9.443 6.4433 
+0

me battra une minute! Pour ce que ça vaut, vous pouvez aussi utiliser df.ix [:: 7] – tnknepp

+1

@tnknepp, merci! '.ix []' - est obsolète dans les versions modernes de Pandas – MaxU

+1

Non, merci, je n'étais pas au courant .ix [] est déconseillé. J'ai besoin de mettre à jour mes pandas. Vous avez maintenant résolu deux problèmes avec votre publication. Merci! – tnknepp

2
df.loc[df.index%7==0] 
Out[124]: 
     0  1 
0 1.345 2.4560 
7 9.443 6.4433 

Ou

df.groupby(df.index//7,as_index=False).first() 
Out[128]: 
     0  1 
0 1.345 2.4560 
1 9.443 6.4433 
+0

C'est une façon intéressante de le faire. Bien que cela fonctionne pour l'exemple de l'OP, cela ne fonctionnera pas si l'indice n'est pas monotone à partir de 0. Encore, intéressant. – tnknepp

+1

en utilisant 'groupby' - est une approche très frais et inhabituel! +1 – MaxU

+1

@MaxU Je ne veux pas utiliser 'groupby' LOL ... mais il est difficile de penser en dehors de votre boîte :-) – Wen