Mis a jour le 2025-04-14, 12:10

Création de Dataframes

Création d'un dataframe :
  • un dataframe se comporte comme un dictionnaire dont les clefs sont les noms des colonnes et les valeurs sont des séries.
  • on peut le créer à partir d'une array numpy (mais ce n'est pas très pratique et le type des données est le même pour toutes les colonnes, ici float64) :
    ar = numpy.array([[1.1, 2, 3.3, 4], [2.7, 10, 5.4, 7], [5.3, 9, 1.5, 15]])
    df = pandas.DataFrame(ar, index = ['a1', 'a2', 'a3'], columns = ['A', 'B', 'C', 'D'])
        
    donne :
    
          A   B    C   D
    a1  1.1   2  3.3   4
    a2  2.7  10  5.4   7
    a3  5.3   9  1.5  15
        
    attention : si on modifie l'array numpy, cela modifie aussi le dataframe.
  • on peut aussi créer le dataframe avec un dictionnaire :
    df = pandas.DataFrame({'A': [1.1, 2.7, 5.3], 'B': [2, 10, 9], 'C': [3.3, 5.4, 1.5], 'D': [4, 7, 15]},
                          index = ['a1', 'a2', 'a3'])
        
    donne :
    
          A   B    C   D
    a1  1.1   2  3.3   4
    a2  2.7  10  5.4   7
    a3  5.3   9  1.5  15
        
  • Pour définir un dataframe avec les colonnes dans l'ordre que l'on veut : df = pandas.DataFrame({'A': [1.1, 2.7, 5.3], 'B': [2, 10, 9], 'C': [3.3, 5.4, 1.5], 'D': [4, 7, 15]}, columns = ['A', 'B', 'C', 'D'])
  • on peut aussi donner une liste de dictionnaires :
    pandas.DataFrame([{'A': 1.1, 'B': 2, 'C': 3.3, 'D': 4},
        {'A': 2.7, 'B': 10, 'C': 5.4, 'D': 7},
        {'A': 5.3, 'B': 9, 'C': 1.5, 'D': 15}])
        
    donne la même chose.
  • on peut aussi donner un dictionnaire dont les clefs seront les index plutôt que les colonnes :
    pandas.DataFrame.from_dict({'A': [1.1, 2.7, 5.3], 'B': [2, 10, 9],
        'C': [3.3, 5.4, 1.5], 'D': [4, 7, 15]}, orient = 'index')
        
    donne :
    
         0     1     2
    A  1.1   2.7   5.3
    C  3.3   5.4   1.5
    B  2.0  10.0   9.0
    D  4.0   7.0  15.0
        
  • un index ou les colonnes d'un dataframe peuvent avoir un nom :
    • df.index.name = 'myIndexName' (si on imprime le frame dans un fichier csv avec l'index, la colonne sera nommée avec le nom de l'index).
    • df.columns.name = 'myColumnName'
  • Autres initialisations de dataframes :
    • df = pandas.DataFrame(columns = ['A', 'B']) : dataframe avec 0 lignes
    • df = pandas.DataFrame(columns = ['A', 'B'], index = ['a', 'b']) : dataframe avec 2 lignes et que des NA
    • df = pandas.DataFrame(0, index = [0, 1], columns = ['a', 'b']) : dataframe initialisé avec que des 0.
    • df.fillna(0, inplace = True) : le remplit avec des 0 plutot que des NaN
    • mais, attention ! : initialement, les types des colonnes sont "object" et une colonne peut avoir des valeurs de types héterogènes !
    • pour éviter ça, on peut donner un type à la création : df = pandas.DataFrame(columns = ['A', 'B'], index = ['a', 'b'], dtype = float) (ou numpy.float64, ça revient au même)
  • on peut réindexer un dataframe pour changer l'ordre des lignes et/ou des colonnes, ou n'en récupérer que certaines : df.reindex(columns = ['C', 'B', 'A'], index = ['a2', 'a3'])
  • df.dtypes : les types des différentes colonnes du dataframe, ici :
    
    A    float64
    B      int64
    C    float64
    D      int64
        
  • détermination du type d'une colonne :
    • df['myCol'].dtype : donne le type
    • pandas.api.types.is_numeric_dtype(df[col].dtype) : renvoie True uniquement si le type est numérique.
    • pandas.api.types.is_string_dtype(df[col].dtype) : renvoie True uniquement si le type est une chaîne de caractères.
  • si les series ont des index, le dataframe utilise ces index pour construire le dataframe : df = pandas.DataFrame({'col1': pandas.Series([2, 3, 4], index = ['a', 'b', 'c']), 'col2': pandas.Series([6, 7, 8], index = ['b', 'a', 'd'])}) donne :
    
       col1  col2
    a     2     7
    b     3     6
    c     4   NaN
    d   NaN     8
        
  • On peut mettre une seule valeur pour une colonne dans la définition d'un dataframe : df = pandas.DataFrame({'a': 1, 'b': [2, 3, 4], 'c': [5, 6, 7]})
  • df.info() : imprime des infos sur le dataframe : les noms et types des colonnes, le nombre de valeurs non nulles et la place occupée.
  • df.head(2) : renvoie un dataframe avec les 2 premières lignes. Idem avec df.tail(2) pour les deux dernières.
  • df.head(), df.tail() : les 5 premières ou les 5 dernières.
  • df.columns : les noms des colonnes, par exemple Index(['A', 'B', 'C', 'D'], dtype='object').
  • df.columns.values : le nom des colonnes sous forme d'array numpy.
  • df.index : les noms des lignes (individus), par exemple Index(['a1', 'a2', 'a3'], dtype='object').
  • df.index.values : le nom des lignes sous forme d'array numpy.
  • df.values : pour récupérer le dataframe sous forme d'array numpy 2d.
  • df.describe() : renvoie un dataframe donnant des statistiques sur les valeurs (nombres de valeurs, moyenne, écart-type, ...), mais uniquement sur les colonnes numériques (faire df.describe(include = 'all') pour avoir toutes les colonnes) :
    
                  A          B         C          D
    count  3.000000   3.000000  3.000000   3.000000
    mean   3.033333   7.000000  3.400000   8.666667
    std    2.119748   4.358899  1.951922   5.686241
    min    1.100000   2.000000  1.500000   4.000000
    25%    1.900000   5.500000  2.400000   5.500000
    50%    2.700000   9.000000  3.300000   7.000000
    75%    4.000000   9.500000  4.350000  11.000000
    max    5.300000  10.000000  5.400000  15.000000
        
  • df.describe(include = 'all').to_csv(sys.stdout, sep = '\t') : permet d'imprimer les stats sur toutes les colonnes (numériques ou non).
  • on peut régler la largeur d'impression quand on imprime un dataframe avec : pandas.set_option('display.width', 120)
  • on peut lire et modifier le nombre de ligne affichées :
    • pandas.get_option('display.max_rows')
    • pandas.set_option('display.max_rows', None) : pas de maximu,m.
Dimension d'un dataframe :
  • df.shape : renvoie la dimension du dataframe sous forme (nombre de lignes, nombre de colonnes)
  • on peut aussi faire len(df) pour avoir le nombre de lignes (ou également len(df.index)).
  • on peut aussi faire len(df.columns) pour avoir le nombre de colonnes.
  • df.memory_usage() : donne une série avec la place occupeée par chaque colonne (sum(df.memory_usage()) donne la mémoire totale occupée).
Un dataframe peut avoir un nom pour son index de ligne et son index de colonnes :
  • df.index.name = 'myRow'; df.columns.name = 'myCol'
  • ce nom sera utilisé comme nom de colonne si on fait df.stack().reset_index()
On peut réaligner 2 dataframes entre eux :
  • df1.align(df2) : renvoie un tuple de 2 dataframes réalignés, avec par défaut, une jointure externe sur les colonnes et les lignes (index) : ils contiennent la réunion des colonnes et la réunion des lignes, dans le même ordre.
  • df1.align(df2, join = 'inner') : les colonnes et les index communs.
  • il y a aussi la possibilité de faire des jointures externes gauche ou droite avec join = 'left' ou join = 'right'
  • on peut faire l'alignement que sur les lignes avec df1.align(df2, axis = 0) (idem pour les colonnes avec axis = 1).
un dataframe peut avoir 0 colonne, par exemple df0 = pandas.DataFrame({}, index = ['a', 'b', 'c'])
Quand on a un dataframe avec une seule colonne ou une seule ligne, on peut le transformer en series par : df.squeeze() (ne fait rien sur une series ou sur un dataframe avec plusieurs colonnes)
df.memory_usage() : la place mémoire occupée par chaque colonne.

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert