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