web-dev-qa-db-fra.com

python pandas sélectionnez la tête et la queue)

Pour un DataFrame dans Pandas, comment sélectionner à la fois les 5 premières valeurs et les 5 dernières valeurs? Par exemple

In [11]: df
Out[11]: 
        A  B  C
2012-11-29  0  0  0
2012-11-30  1  1  1
2012-12-01  2  2  2
2012-12-02  3  3  3
2012-12-03  4  4  4
2012-12-04  5  5  5
2012-12-05  6  6  6
2012-12-06  7  7  7
2012-12-07  8  8  8
2012-12-08  9  9  9

Comment afficher la première ligne de remorquage et les dernières lignes de remorquage?

10
fu xue

Vous pouvez utiliser iloc avec numpy.r_ :

print (np.r_[0:2, -2:0])
[ 0  1 -2 -1]

df = df.iloc[np.r_[0:2, -2:0]]
print (df)
            A  B  C
2012-11-29  0  0  0
2012-11-30  1  1  1
2012-12-07  8  8  8
2012-12-08  9  9  9

df = df.iloc[np.r_[0:4, -4:0]]
print (df)
            A  B  C
2012-11-29  0  0  0
2012-11-30  1  1  1
2012-12-01  2  2  2
2012-12-02  3  3  3
2012-12-05  6  6  6
2012-12-06  7  7  7
2012-12-07  8  8  8
2012-12-08  9  9  9
14
jezrael

Vous pouvez utiliser df.head(5) et df.tail(5) pour obtenir les cinq premiers et les cinq derniers. En option, vous pouvez créer un nouveau bloc de données et append() tête et queue:

new_df = df.tail(5)
new_df = new_df.append(df.head(5))
8
Linas Fx

Petite fonction simple:

def ends(df, x=5):
    return df.head(x).append(df.tail(x))

Et utilisez comme ça:

df = pd.DataFrame(np.random.Rand(15,6))
ends(df,2)

J'utilise tellement ça, Je pense que ce serait une grande fonctionnalité à ajouter aux pandas. (Aucune fonctionnalité ne doit être ajoutée à l'API principale pandas.DataFrame) Je l'ajoute après l'importation comme suit:

import pandas as pd
def ends(df, x=5):
    return df.head(x).append(df.tail(x))
setattr(pd.DataFrame,'ends',ends)

Utilisez comme ça:

import numpy as np
df = pd.DataFrame(np.random.Rand(15,6))
df.ends(2)
5
ic_fl2

Pas tout à fait la même question mais si vous voulez juste montrer le haut/5 dernières lignes (par exemple avec display en jupyter ou régulier print, il y a potentiellement un moyen plus simple que cela si vous utilisez pd.option_context contexte.

#make 100 3d random numbers
df = pd.DataFrame(np.random.randn(100,3))

# sort them by their axis sum
df = df.loc[df.sum(axis=1).index]

with pd.option_context('display.max_rows',10):
    print(df)

Les sorties:

           0         1         2
0  -0.649105 -0.413335  0.374872
1   3.390490  0.552708 -1.723864
2  -0.781308 -0.277342 -0.903127
3   0.433665 -1.125215 -0.290228
4  -2.028750 -0.083870 -0.094274
..       ...       ...       ...
95  0.443618 -1.473138  1.132161
96 -1.370215 -0.196425 -0.528401
97  1.062717 -0.997204 -1.666953
98  1.303512  0.699318 -0.863577
99 -0.109340 -1.330882 -1.455040

[100 rows x 3 columns]
4
Bolster

Dans Jupyter , en développant la réponse de @ bolster, nous allons créer une fonction de confort réutilisable:

def display_n(df,n): 
    with pd.option_context('display.max_rows',n*2):
        display(df)

Ensuite

display_n(df,2)

Retour

         0           1           2
0        0.167961    -0.732745   0.952637
1        -0.050742   -0.421239   0.444715
...      ...         ...         ...
98       0.085264    0.982093    -0.509356
99       -0.758963   -0.578267   -0.115865

(sauf sous forme de tableau HTML bien formaté)

lorsque df est df = pd.DataFrame(np.random.randn(100,3))

Remarques:

  1. Bien sûr, vous pouvez faire imprimer la même chose que du texte en modifiant display en print ci-dessus.
  2. Sur les systèmes de type Unix, vous pouvez charger automatiquement la fonction ci-dessus dans tous les ordinateurs portables en la plaçant dans un fichier py ou ipy dans ~/.ipython/profile_default/startup Comme décrit ici .
1
watsonic

Associé à Linas Fx.

Définition ci-dessous

pd.DataFrame.less = lambda df, n=10: df.head(n//2).append(df.tail(n//2))

alors vous ne pouvez taper que df.less()

C'est la même chose que le type df.head().append(df.tail())

Si vous tapez df.less(2), le résultat est le même que df.head(1).append(df.tail(1))

0
You Oneandzero

vous pouvez utiliser df.head (2) et df.tail (2)

0
Subhash Moond