Python: Paginer facilement un dataframe Pandas

Voici une petite astuce qui permet de paginer un dataframe en utilisant les slices et l'itération d'un générateur.

1. Première étape importante, créer le générateur.

>>> def advance(start=0, step=10):
...     while True:
...             yield slice(start, start + step)
...             start += step
...

La fonction advance est un générateur grâce au mot clé yield.

Elle permet de retourner un objet slice avec les valeurs start et end incrémentées à chaque itération.

2. Utilisation de la fonction advance pour la pagination d'un dataframe.


>>> import pandas as pd
>>> df = pd.read_csv('https://www.data.gouv.fr/fr/datasets/r/3b318b9e-e11b-4d57-a3e0-8fdc7bfb601a')
>>> df.columns
Index(['codePostal', 'codeCommune', 'nomCommune', 'libelleAcheminement'], dtype='object')
>>> df.dtypes
codePostal              int64
codeCommune            object
nomCommune             object
libelleAcheminement    object
dtype: object
>>> a = advance()
>>> df.iloc[next(a)]
   codePostal codeCommune           nomCommune  libelleAcheminement
0       10200       10002           Ailleville           AILLEVILLE
1       10160       10003  Aix-Villemaur-Pâlis  AIX-VILLEMAUR-PALIS
2       10190       10003  Aix-Villemaur-Pâlis  AIX-VILLEMAUR-PALIS
3       10700       10004        Allibaudières        ALLIBAUDIERES
4       10140       10005               Amance               AMANCE
5       10700       10006       Arcis-sur-Aube       ARCIS SUR AUBE
6       10200       10007           Arconville           ARCONVILLE
7       10140       10008             Argançon             ARGANCON
8       10340       10009             Arrelles             ARRELLES
9       10330       10010         Arrembécourt         ARREMBECOURT
>>> df.iloc[next(a)]
    codePostal codeCommune          nomCommune libelleAcheminement
10       10200       10011         Arrentières         ARRENTIERES
11       10200       10012            Arsonval            ARSONVAL
12       10320       10013             Assenay             ASSENAY
13       10220       10014         Assencières         ASSENCIERES
14       10150       10015           Aubeterre           AUBETERRE
15       10240       10017              Aulnay              AULNAY
16       10130       10018               Auxon               AUXON
17       10220       10019         Val-d Auzon         VAL D AUZON
18       10400       10020  Avant-lès-Marcilly  AVANT LES MARCILLY
19       10240       10021  Avant-lès-Ramerupt  AVANT LES RAMERUPT
>>> df.iloc[next(a)]
    codePostal codeCommune              nomCommune     libelleAcheminement
20       10340       10022           Avirey-Lingey           AVIREY LINGEY
21       10290       10023            Avon-la-Pèze            AVON LA PEZE
22       10130       10024                 Avreuil                 AVREUIL
23       10340       10025        Bagneux-la-Fosse        BAGNEUX LA FOSSE
24       10330       10026         Bailly-le-Franc         BAILLY LE FRANC
25       10330       10027            Balignicourt            BALIGNICOURT
26       10210       10028        Balnot-la-Grange        BALNOT LA GRANGE
27       10110       10029      Balnot-sur-Laignes      BALNOT SUR LAIGNES
28       10600       10030  Barberey-Saint-Sulpice  BARBEREY SAINT SULPICE
29       10400       10031                Barbuise                BARBUISE

Le principe, on créé un objet "a" faisant référence à la fonction advance.
A chaque itération sur l'objet "a" grâce au mot clé next, un nouveau slice est généré.
Pour réinitialiser l'itération, il suffit de créer à nouveau l'objet "a".

La fonction advance permet également de définir un pas d'avancement et une position de départ différents.

>>> page = advance(step=20)
>>> df.iloc[next(page)]
    codePostal codeCommune           nomCommune  libelleAcheminement
0        10200       10002           Ailleville           AILLEVILLE
1        10160       10003  Aix-Villemaur-Pâlis  AIX-VILLEMAUR-PALIS
2        10190       10003  Aix-Villemaur-Pâlis  AIX-VILLEMAUR-PALIS
3        10700       10004        Allibaudières        ALLIBAUDIERES
4        10140       10005               Amance               AMANCE
5        10700       10006       Arcis-sur-Aube       ARCIS SUR AUBE
6        10200       10007           Arconville           ARCONVILLE
7        10140       10008             Argançon             ARGANCON
8        10340       10009             Arrelles             ARRELLES
9        10330       10010         Arrembécourt         ARREMBECOURT
10       10200       10011          Arrentières          ARRENTIERES
11       10200       10012             Arsonval             ARSONVAL
12       10320       10013              Assenay              ASSENAY
13       10220       10014          Assencières          ASSENCIERES
14       10150       10015            Aubeterre            AUBETERRE
15       10240       10017               Aulnay               AULNAY
16       10130       10018                Auxon                AUXON
17       10220       10019          Val-d Auzon          VAL D AUZON
18       10400       10020   Avant-lès-Marcilly   AVANT LES MARCILLY
19       10240       10021   Avant-lès-Ramerupt   AVANT LES RAMERUPT
>>> df.iloc[next(page)]
    codePostal codeCommune              nomCommune     libelleAcheminement
20       10340       10022           Avirey-Lingey           AVIREY LINGEY
21       10290       10023            Avon-la-Pèze            AVON LA PEZE
22       10130       10024                 Avreuil                 AVREUIL
23       10340       10025        Bagneux-la-Fosse        BAGNEUX LA FOSSE
24       10330       10026         Bailly-le-Franc         BAILLY LE FRANC
25       10330       10027            Balignicourt            BALIGNICOURT
26       10210       10028        Balnot-la-Grange        BALNOT LA GRANGE
27       10110       10029      Balnot-sur-Laignes      BALNOT SUR LAIGNES
28       10600       10030  Barberey-Saint-Sulpice  BARBEREY SAINT SULPICE
29       10400       10031                Barbuise                BARBUISE
30       10200       10032               Baroville               BAROVILLE
31       10200       10033            Bar-sur-Aube            BAR SUR AUBE
32       10110       10034           Bar-sur-Seine           BAR SUR SEINE
33       10310       10035                   Bayel                   BAYEL
34       10190       10037        Bercenay-en-Othe        BERCENAY EN OTHE
35       10290       10038       Bercenay-le-Hayer       BERCENAY LE HAYER
36       10200       10039                Bergères                BERGERES
37       10130       10040                  Bernon                  BERNON
38       10110       10041            Bertignolles            BERTIGNOLLES
39       10160       10042                 Bérulle                 BERULLE

 

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.