Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@YannBouyeron
Last active April 28, 2019 00:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YannBouyeron/ead632d34de01215195e9e3e69c17422 to your computer and use it in GitHub Desktop.
Save YannBouyeron/ead632d34de01215195e9e3e69c17422 to your computer and use it in GitHub Desktop.

Introduction à Pandas.

Les Series.

On commence par importer les modules suivants:
>>> import pandas as pd 
>>> import numpy as np 	
On peut ensuite créer une série qui peut contenir des int float ou str :
>>> s = pd.Series([2,4,6,8])

>>> s
0    2
1    4
2    6
3    8
dtype: int64
On peut éventuellement préciser certains arguments:
>>> s = pd.Series([2,4,6,8], name="gogo", dtype="float", index=list("abcd"))

>>> s
a    2.0
b    4.0
c    6.0
d    8.0
Name: gogo, dtype: float64
Ou modifier / ajouter chacun de ces arguments plus tard..
>>> s.name = "toto"

>>> s.index = list("ABCD")

>>> s
A    2.0
B    4.0
C    6.0
D    8.0
Name: toto, dtype: float64
Pour changer le dtype on utilise la méthode astype:
>>> s2 = s.astype(‘int64’) # ou s.astype(int) ou s.astype(float)...

>>> s2
0    2
1    4
2    6
3    8
Name: toto, dtype: int64
Il existe aussi d’autres manières de créer des séries:

A partir d’un dictionnaire {label : valeur} :

>>> a = pd.Series({"a":2,"b":4,"c":6,"d":8})

>>> a
0    2
1    4
2    6
3    8
dtype: int64

A partir d’un Ndarray:

>>> b = pd.Series(np.arange(2,10,2))

>>> b
0    2
1    4
2    6
3    8
dtype: int32
Sélectionner un élément par son index:
>>> s
A    2.0
B    4.0
C    6.0
D    8.0
Name: toto, dtype: float64

>>> s[0]
2.0

>>> s.iloc[0]
2.0
Sélectionner un élément par son label (à condition qu’il en ait un):
>>> s.A
2.0

>>> s.loc["A"]
2.0	
Modifier un élément par son index ou par son label:
>>> s
A    2
B    4
C    6
D    8
Name: toto, dtype: int64

>>> s.A = 45
>>> s.B = 'gogo'
>>> s.C = 6.9
>>> s.iloc[3] = "bobo"

>>> s
A      45
B    gogo
C     6.9
D    bobo
Name: toto, dtype: object
Faire des opérations sur une série:
>>> s
A    2.0
B    4.0
C    6.0
D    8.0
Name: toto, dtype: float64

>>> f = s*2

>>> f
A     4.0
B     8.0
C    12.0
D    16.0
Name: toto, dtype: float64
Assembler des séries:
>> z = pd.Series(list("wxyz"))

>>> z
0    w
1    x
2    y
3    z
dtype: object

>>> s
A    2.0
B    4.0
C    6.0
D    8.0
Name: toto, dtype: float64

>>> x = s.append(z, ignore_index=True)

>>> x
0    2
1    4
2    6
3    8
4    w
5    x
6    y
7    z
dtype: object

Les DataFrame

Créer un DataFrame:

Il existe de très nombreuses façons de créer un DataFrame... en voici 4

A partir d’un dictionnaire de tuples:
>>> d = {"nom":("Diatta", "Sane", "Diouf"), "prenom":("Robert", "Jean", "Albert")}

>>> df = pd.DataFrame(d)

>>> df
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert
A partir d’un array:
>>> n = np.array((("Diatta", "Robert"),("Sane", "Jean"),("Diouf", "Albert")))                                   

>>> n
array([['Diatta', 'Robert'],
       ['Sane', 'Jean'],
       ['Diouf', 'Albert']], dtype='<U6')

>>> df = pd.DataFrame(n, columns=("nom","prenom"))

>>> df
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert
A partir d’une liste de tuples (ou d’une liste de listes):
>>> t = [('Diatta', 'Robert'), ('Sane', 'Jean'), ('Diouf', 'Albert')]

>>> t
[('Diatta', 'Robert'), ('Sane', 'Jean'), ('Diouf', 'Albert')]

>>> df = pd.DataFrame(t, columns=("nom","prenom"))

>>> df
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert
A partir d’une liste de pd.Series:
>>> a = pd.Series(("Diatta","Robert"))
>>> b = pd.Series(("Sane","Jean"))
>>> c = pd.Series(("Diouf","Albert"))

>>> a
0    Diatta
1    Robert
dtype: object

>>> df = pd.DataFrame([a,b,c])

>>> df
        0       1
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

>>> df.columns = ("nom", "prenom")

>>> df
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

Ou

>>> n = pd.Series(["Diatta","Sane","Diouf"])
>>> p = pd.Series(["Robert","Jean","Albert"])

>>> n
0    Diatta
1      Sane
2     Diouf
dtype: object

>>> p
0    Robert
1      Jean
2    Albert
dtype: object

>>> df = pd.DataFrame([n,p])

>>> df
        0     1       2
0  Diatta  Sane   Diouf
1  Robert  Jean  Albert

>>> df = df.T

>>> df
        0       1
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

>>> df.columns = ("Nom","Prenom")

>>> df
      Nom  Prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

Sélectionner, trier, filtrer un DataFrame

>>> df
      nom  prenom              mail
0  Diatta  Robert    rob@hotmail.fr
1    Sane    Jean  jean@hotmail.com
2   Diouf  Albert  bebert@gmail.com
Afficher les premières lignes d’un DataFrame.
>>> df.head()
      nom  prenom              mail
0  Diatta  Robert    rob@hotmail.fr
1    Sane    Jean  jean@hotmail.com
2   Diouf  Albert  bebert@gmail.com	

On ne voit pas la différence car mon DataFrame ne fait que trois lignes... mais c’est bien pratique quand on a un DataFrame de 3000 lignes. De plus il est possible de passer le nombre de lignes désiré en argument de head().

Seléctionner une colonne par son label... on récupère un pd.Series:
>>> n = df.nom

>>> type(n)
<class 'pandas.core.series.Series'>

>>> n
0    Diatta
1      Sane
2     Diouf
Name: nom, dtype: object


>>> df["nom"]
0    Diatta
1      Sane
2     Diouf
Name: nom, dtype: object
Sélectionner l’élément d’index 1 de la colonne "nom":
>>> df.nom[1]
'Sane'
Séléctionner des colonnes et des lignes avec loc et iloc: (on récupère un DataFrame)
La méthode iloc permet de sélectionner par les index:

Sélection de toutes les lignes de la colonne d’index 0 incluse jusqu’à la colonne d’index 1 exclue:

>>> w = df.iloc[:, :1]

>>> w
      nom
0  Diatta
1    Sane
2   Diouf

>>> type(w)
<class 'pandas.core.frame.DataFrame'>

Vous remarquerez que iloc retourne un DataFrame

Sélection de toutes les colonnes de la ligne d’index 1 incluse jusqu’à la ligne d’index 2 exclue:

>>> df.iloc[1:2]
    nom prenom              mail
1  Sane   Jean  jean@hotmail.com
La méthode loc permet de sélectionner par les labels

Sélectionner des colonnes entières:

>>> df.loc[:,["nom","mail"]]
      nom              mail
0  Diatta    rob@hotmail.fr
1    Sane  jean@hotmail.com
2   Diouf  bebert@gmail.com


>>> df.loc[["nom","mail"]]
      nom              mail
0  Diatta    rob@hotmail.fr
1    Sane  jean@hotmail.com
2   Diouf  bebert@gmail.com

Sélectionner des lignes (n’ayant pas de labels): les index des lignes sont alors considérés comme des labels. Les index initiaux et finaux sont alors inclus dans le retour.

>>> df.loc[1:2]
     nom  prenom              mail
1   Sane    Jean  jean@hotmail.com
2  Diouf  Albert  bebert@gmail.com

Ajoutons des labels de lignes:

>>> df.index = list("abc")

>>> df
      nom  prenom              mail
a  Diatta  Robert    rob@hotmail.fr
b    Sane    Jean  jean@hotmail.com
c   Diouf  Albert  bebert@gmail.com

Sélection de la ligne b incluse à c incluse:

>>> df.loc["b":"c"]
     nom  prenom              mail
b   Sane    Jean  jean@hotmail.com
c  Diouf  Albert  bebert@gmail.com

Sélection des colonnes nom et mail pour les lignes b incluse à c incluse:

>>> df.loc["b":"c",["nom","mail"]]
     nom              mail
b   Sane  jean@hotmail.com
c  Diouf  bebert@gmail.com

Sélectionner les lignes a et c des colonnes nom et mail

>>> df.loc[[0,2],["nom","mail"]]
      nom                mail
a  Diatta   robert@hotmail.fr
c   Diouf  bebert@hotmail.com

On peut toujours sélectionner par les index avec iloc si on le souhaite:

>>> df.iloc[1:2]
    nom prenom              mail
b  Sane   Jean  jean@hotmail.com

>>> df.iloc[1:3]
     nom  prenom              mail
b   Sane    Jean  jean@hotmail.com
c  Diouf  Albert  bebert@gmail.com

Modifier un DataFrame

Transposer
>>> df
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

>>> df.T
             0     1       2
nom     Diatta  Sane   Diouf
prenom  Robert  Jean  Albert
Changer (ou ajouter) des noms de colonnes et de labels:
>>> df
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

>>> df.columns
Index(['nom', 'prenom'], dtype='object')

>>> df.columns = ("colA","colB")

>>> df
     colA    colB
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

>>> df.index
RangeIndex(start=0, stop=3, step=1)

>>> df.index = list("abc")

>>> df
     colA    colB
a  Diatta  Robert
b    Sane    Jean
c   Diouf  Albert
Ajouter une colonne à un DataFrame:
>>> df
     colA    colB
a  Diatta  Robert
b    Sane    Jean
c   Diouf  Albert

>>> df["colC"] = (34,21,45)

>>> df
     colA    colB  colC
a  Diatta  Robert    34
b    Sane    Jean    21
c   Diouf  Albert    45
Concatener des DataFrame ... pour ajouter une (ou plusieurs) colonne.
>>> df
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

>>> m
                 mail
0   robert@hotmail.fr
1      jean@gmail.com
2  bebert@hotmail.com

>>> pd.concat([df,m],axis=1)
      nom  prenom                mail
0  Diatta  Robert   robert@hotmail.fr
1    Sane    Jean      jean@gmail.com
2   Diouf  Albert  bebert@hotmail.com
Concatener des DataFrame ... pour ajouter une (ou plusieurs) ligne.
>>> raw = pd.DataFrame([("Dupond","Serge")], columns=("colA","colB"))

>>> raw
     colA   colB
0  Dupond  Serge

>>> df
     colA    colB
a  Diatta  Robert
b    Sane    Jean
c   Diouf  Albert

>>> df2 = df.append(raw)

>>> df2
     colA    colB
a  Diatta  Robert
b    Sane    Jean
c   Diouf  Albert
0  Dupond   Serge

>>> df3 = df.append(raw, ignore_index=True)

>>> df3
     colA    colB
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert
3  Dupond   Serge

Il existe de très nombreuses autres méthodes pour concatener des DataFrame... Doc officielle

Supprimer une ou plusieurs colonnes:
>>> df
     colA    colB  colC
a  Diatta  Robert    34
b    Sane    Jean    21
c   Diouf  Albert    45

>>> df2 = df.drop(["colC"], axis=1)
>>> df2
     colA    colB
a  Diatta  Robert
b    Sane    Jean
c   Diouf  Albert



>>> df
     colA    colB  colC
a  Diatta  Robert    34
b    Sane    Jean    21
c   Diouf  Albert    45

>>> df3 = df.drop(columns=["colC"])
>>> df3
     colA    colB
a  Diatta  Robert
b    Sane    Jean
c   Diouf  Albert
Supprimer une ou plusieurs lignes:
>>> df
     colA    colB  colC
a  Diatta  Robert    34
b    Sane    Jean    21
c   Diouf  Albert    45

>>> df2 = df.drop(["a"])

>>> df2
    colA    colB  colC
b   Sane    Jean    21
c  Diouf  Albert    45

Utiliser une base de données SQLite avec Pandas

Importer les modules pandas et sqlite3:
>>> import pandas as pd
>>> from sqlite3 import *
Se connecter à une base existante, ou en créer une avec sqlite3.connect:
>>> conn = connect("base.db")

On peut aussi se connecter de la même façon à une base SQL en plaçant son URL en argument de connect.

Créer un DataFrame:

Vous pouvez créer un DataFrame vide ou contenant déjà des lignes

>>> df = pd.DataFrame({"nom":("Admi", "Diatta", "Sane"), "mail":("admi@gmail.com", "robert@hotmail.com", "jean@hotmail.fr"), "level":(2,1,1)})

>>> df
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1
Convertir le DataFrame en table sql:
>>> df.to_sql("users", conn, index=False)
Convertir une base sql en DataFrame:

On peut éventuellement commencer par récupérer les noms des tables:

>>> liste_tables = pd.read_sql_query("select name from sqlite_master where type = 'table'", conn)

>>> liste_tables
    name
0  users

Ma base de données contient ici une seule table nommée users.

Puis envoyer une requête SQL pour récupérer le contenu d’une table

>>> users = pd.read_sql_query("select * from users", conn)

>>> users
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1
Modifier la base sql:

En utilisant une commande sql:

>>> cur = conn.cursor()

>>> cur.execute("insert into users(nom, mail, level) values('Diouf', 'dio@yahoo.com', 1)") 
<sqlite3.Cursor object at 0x73590d60>

>>> users = pd.read_sql_query("select * from users", conn)

>>> users
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1
3   Diouf       dio@yahoo.com      1

En modifiant le DataFrame et en remplaçant l’ancienne table par le nouveau DataFrame:

>>> users = pd.read_sql_query("select * from users", conn)

>>> users
          nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1

>>> raw = pd.DataFrame({"nom":("Samb",), "mail":("samba@gmail.com",), "level":(3,)})

>>> users = users.append(raw, ignore_index=True)

>>> users
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1
3    Samb     samba@gmail.com      3

>>> users.to_sql("users", conn, index=False, if_exists="replace")

Utiliser des bases de données au format CSV avec Pandas.

Créer un DataFrame:
>>> df = pd.DataFrame({"nom":("Admi", "Diatta", "Sane"), "mail":("admi@gmail.com", "robert@hotmail.com", "jean@hotmail.fr"), "level":(2,1,1)})

>>> df
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1 
Le convertir en CSV:
>>> df.to_csv("mycsv", index=False)
Convertir un CSV en DataFrame:
>>> users = pd.read_csv("mycsv")

>>> users
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1

On peut aussi passer l'URL du CSV en argument à la place de son path

Modifier le CSV:
>>> users = pd.read_csv("mycsv")

>>> raw = pd.DataFrame({"nom":("Samb",), "mail":("samba@gmail.com",), "level":(3,)})

>>> users = users.append(raw, ignore_index=True)

>>> users
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1
3    Samb     samba@gmail.com      3

>>> users.to_csv("mycsv", index=False)

>>> users2 = pd.read_csv("mycsv")

>>> users2
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1
3    Samb     samba@gmail.com      3

Utiliser des fichiers xlsx:

Convertir un DataFrame en un fichier xlsx, puis l’inverse:
>>> df
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1

>>> df.to_excel("mybase.xlsx", sheet_name = "Modou")

>>> users = pd.read_excel("mybase.xlsx")

>>> users
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1
Créer un xlsx avec plusieurs feuilles:
>>> df1 = pd.DataFrame({"nom":("Admi", "Diatta", "Sane"), "mail":("admi@gmail.com", "robert@hotmail.com", "jean@hotmail.fr"), "level":(2,1,1)})

>>> df2 = pd.DataFrame({"nom":("Diatta", "Sane", "Diouf"), "prenom":("Robert", "Jean", "Albert")})
   
>>> writer = pd.ExcelWriter('gogo.xlsx')

>>> df1.to_excel(writer,'feuille 1')

>>> df2.to_excel(writer,'feuille 2')

>>> writer.save()
Récupérer une ou plusieurs feuilles d’un xlsx:

Récupérer la feuille 1: feuille d’index 0 retournée par défaut:

>>> table1 = pd.read_excel("gogo.xlsx")

>>> table1
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1

Récupérer la feuille 2 (feuille d’index 1):

>>> table2 = pd.read_excel("gogo.xlsx", sheet_name = 1)

>>> table2
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

>>> table2 = pd.read_excel("gogo.xlsx", sheet_name = "feuille 2")

>>> table2
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

Récupérer les feuilles 0 et 1 (on obtient un dictionnaire de feuilles):

>>> tables = pd.read_excel("gogo.xlsx", sheet_name = [0,1])

>>> tables
OrderedDict([(0,       nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1), (1,       nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert)])

Récupérer toutes les feuilles (on obtient un dicitionnaire de feuilles):

>>> tables = pd.read_excel("gogo.xlsx", sheet_name = None)

>>> tables
OrderedDict([('feuille 1',       nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1), ('feuille 2',       nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert)])

>>> tables.keys()
odict_keys(['feuille 1', 'feuille 2'])

>>> tables["feuille 1"]
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1

>>> tables["feuille 2"]
      nom  prenom
0  Diatta  Robert
1    Sane    Jean
2   Diouf  Albert

Convertir un DataFrame en Json :

>>> df 
      nom                mail  level
0    Admi      admi@gmail.com      2
1  Diatta  robert@hotmail.com      1
2    Sane     jean@hotmail.fr      1

>>> df.to_json()
'{"nom":{"0":"Admi","1":"Diatta","2":"Sane"},"mail":{"0":"admi@gmail.com","1":"robert@hotmail.com","2":"jean@hotmail.fr"},"level":{"0":2,"1":1,"2":1}}'

>>> df.to_json("myjson.js") # le json est enregistré dans le fichier myjson.js

Convertir un Dataframe en html :

>>> pd.set_option('display.max_colwidth', -1) # c'est pour ne pas couper les phrases trops longues 

>>> html = df.to_html()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment