Skip to content

pandas : Sélectionner des lignes/colonnes dans un DataFrame en indexant « [] ».

Vous pouvez sélectionner et obtenir des lignes, des colonnes et des éléments dans pandas.DataFrame et pandas.Series en indexant les opérateurs (crochets) [].

Cet article décrit le contenu suivant.

  • Sélectionnez les colonnes de pandas.DataFrame
    • [Nom de la colonne] : obtenir une seule colonne en tant que série
    • [Liste des noms de colonnes] : obtenez une ou plusieurs colonnes en tant que DataFrame
  • Sélectionnez des lignes de pandas.DataFrame
    • [Slice of row name/number] : obtenir une ou plusieurs lignes en tant que DataFrame
    • [Tableau booléen/Série] : Obtenir les lignes True en tant que DataFrame
  • Sélectionnez des éléments de pandas.Series
    • [Label/position] : obtenir la valeur d’un seul élément
    • [Liste des étiquettes/positions] : obtenez un ou plusieurs éléments en tant que série
    • [Slice of label/position] : obtenir un ou plusieurs éléments en tant que série
    • [Tableau booléen/Série] : obtenir les éléments True en tant que série
  • Sélectionnez les éléments de pandas.DataFrame
  • Notez que les noms de ligne et de colonne sont des nombres entiers

Vous pouvez également sélectionner les colonnes par tranche et les lignes par son nom/numéro ou leur liste avec loc et iloc.

Le fichier CSV suivant est utilisé dans cet exemple de code.

import pandas as pd

print(pd.__version__)
# 1.4.1

df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

Sélectionnez les colonnes de pandas.DataFrame

[Column name] : obtenez une seule colonne en tant que pandas.Series

Vous pouvez obtenir la colonne en tant que pandas.Series en spécifiant le nom de la colonne (étiquette) dans [].

print(df['age'])
print(type(df['age']))
# name
# Alice      24
# Bob        42
# Charlie    18
# Dave       68
# Ellen      24
# Frank      30
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

Vous pouvez également spécifier des noms de colonne en tant qu’attribut, comme .. Notez que si le nom de colonne est en conflit avec des noms de méthode existants, la méthode est prioritaire.

print(df.age)
print(type(df.age))
# name
# Alice      24
# Bob        42
# Charlie    18
# Dave       68
# Ellen      24
# Frank      30
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

[Liste des noms de colonnes] : Obtenez une ou plusieurs colonnes en tant que pandas.DataFrame

Vous pouvez obtenir plusieurs colonnes en tant que pandas.DataFrame en spécifiant une liste de noms de colonnes dans []. Les colonnes seront dans l’ordre de la liste spécifiée.

print(df[['point', 'age']])
print(type(df[['point', 'age']]))
#          point  age
# name               
# Alice       64   24
# Bob         92   42
# Charlie     70   18
# Dave        70   68
# Ellen       88   24
# Frank       57   30
# <class 'pandas.core.frame.DataFrame'>

Si vous spécifiez une liste avec un élément, une seule colonne pandas.DataFrame est renvoyée, pas pandas.Series.

print(df[['age']])
print(type(df[['age']]))
#          age
# name        
# Alice     24
# Bob       42
# Charlie   18
# Dave      68
# Ellen     24
# Frank     30
# <class 'pandas.core.frame.DataFrame'>

Vous pouvez également spécifier une tranche du nom de colonne avec loc ou un numéro de colonne avec iloc. Voir l’article suivant pour plus de détails.

print(df.loc[:, 'age':'state'])
print(type(df.loc[:, 'age':'state']))
#          age state
# name              
# Alice     24    NY
# Bob       42    CA
# Charlie   18    CA
# Dave      68    TX
# Ellen     24    CA
# Frank     30    NY
# <class 'pandas.core.frame.DataFrame'>

print(df.iloc[:, [2, 0]])
print(type(df.iloc[:, [2, 0]]))
#          point  age
# name               
# Alice       64   24
# Bob         92   42
# Charlie     70   18
# Dave        70   68
# Ellen       88   24
# Frank       57   30
# <class 'pandas.core.frame.DataFrame'>

Sélectionnez des lignes de pandas.DataFrame

[Slice of row name/number] : obtenir une ou plusieurs lignes en tant que pandas.DataFrame

Vous pouvez obtenir plusieurs lignes en tant que pandas.DataFrame en spécifiant une tranche dans [].

print(df[1:4])
print(type(df[1:4]))
#          age state  point
# name                     
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# <class 'pandas.core.frame.DataFrame'>

Vous pouvez spécifier une valeur négative et un pas (début:arrêt:pas) comme dans une tranche normale. Par exemple, vous pouvez utiliser des tranches pour extraire des lignes paires ou impaires.

print(df[:-3])
print(type(df[:-3]))
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# <class 'pandas.core.frame.DataFrame'>

print(df[::2])
print(type(df[::2]))
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Ellen     24    CA     88
# <class 'pandas.core.frame.DataFrame'>

print(df[1::2])
print(type(df[1::2]))
#        age state  point
# name                   
# Bob     42    CA     92
# Dave    68    TX     70
# Frank   30    NY     57
# <class 'pandas.core.frame.DataFrame'>

Une erreur est générée si un numéro de ligne est spécifié seul au lieu d’une tranche.

# print(df[1])
# KeyError: 1

Si une seule ligne est sélectionnée, pandas.DataFrame est renvoyé, pas pandas.Series.

print(df[1:2])
print(type(df[1:2]))
#       age state  point
# name                  
# Bob    42    CA     92
# <class 'pandas.core.frame.DataFrame'>

Vous pouvez également spécifier une tranche de nom de ligne (étiquette) au lieu du numéro de ligne (position). Dans le cas d’une tranche avec nom de ligne, la ligne d’arrêt est incluse.

print(df['Bob':'Ellen'])
print(type(df['Bob':'Ellen']))
#          age state  point
# name                     
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# <class 'pandas.core.frame.DataFrame'>

Vous pouvez spécifier le nom/numéro de ligne seul ou sa liste avec loc ou iloc. Voir l’article suivant pour plus de détails.

print(df.loc['Bob'])
print(type(df.loc['Bob']))
# age      42
# state    CA
# point    92
# Name: Bob, dtype: object
# <class 'pandas.core.series.Series'>

print(df.loc[['Bob', 'Ellen']])
print(type(df.loc[['Bob', 'Ellen']]))
#        age state  point
# name                   
# Bob     42    CA     92
# Ellen   24    CA     88
# <class 'pandas.core.frame.DataFrame'>

print(df.iloc[[1, 4]])
print(type(df.iloc[[1, 4]]))
#        age state  point
# name                   
# Bob     42    CA     92
# Ellen   24    CA     88
# <class 'pandas.core.frame.DataFrame'>

[Tableau booléen/Série] : Obtenez les lignes True en tant que pandas.DataFrame

En spécifiant un tableau booléen (list ou numpy.ndarray) dans [], vous pouvez extraire les lignes True en tant que pandas.DataFrame.

l_bool = [True, False, False, True, True, False]
print(df[l_bool])
#        age state  point
# name                   
# Alice   24    NY     64
# Dave    68    TX     70
# Ellen   24    CA     88

Une erreur est levée si le nombre d’éléments ne correspond pas.

# print(df[[True, False, False]])
# ValueError: Item wrong length 3 instead of 6.

Vous pouvez également spécifier le booléen pandas.Series. Les lignes sont extraites en fonction des étiquettes, et non de l’ordre.

s_bool = pd.Series(l_bool, index=reversed(df.index))
print(s_bool)
# Frank       True
# Ellen      False
# Dave       False
# Charlie     True
# Bob         True
# Alice      False
# dtype: bool

print(df[s_bool])
#          age state  point
# name                     
# Bob       42    CA     92
# Charlie   18    CA     70
# Frank     30    NY     57

Une erreur est générée si le nombre d’éléments ou d’étiquettes ne correspond pas.

s_bool_wrong = pd.Series(l_bool, index=['A', 'B', 'C', 'D', 'E', 'F'])

# print(df[s_bool_wrong])
# IndexingError: Unalignable boolean Series provided as indexer
# (index of the boolean Series and of the indexed object do not match).

Sélectionnez des éléments de pandas.Series

Utilisez les pandas.Series suivants comme exemple.

s = df['age']
print(s)
# name
# Alice      24
# Bob        42
# Charlie    18
# Dave       68
# Ellen      24
# Frank      30
# Name: age, dtype: int64

[Label/position] : obtenir la valeur d’un seul élément

Vous pouvez obtenir la valeur de l’élément en spécifiant uniquement l’étiquette/la position (index). Lors de la spécification par position (index), une valeur négative peut être utilisée pour spécifier la position à partir de la fin. -1 est la queue.

Vous pouvez également spécifier le nom de l’étiquette en tant qu’attribut, comme .

print(s[3])
print(type(s[3]))
# 68
# <class 'numpy.int64'>

print(s['Dave'])
print(type(s['Dave']))
# 68
# <class 'numpy.int64'>

print(s[-1])
print(type(s[-1]))
# 30
# <class 'numpy.int64'>

print(s.Dave)
print(type(s.Dave))
# 68
# <class 'numpy.int64'>

[Liste des étiquettes/positions] : Obtenez un ou plusieurs éléments en tant que pandas.Series

Vous pouvez sélectionner plusieurs valeurs comme pandas.Series en spécifiant une liste d’étiquettes/positions. Les éléments seront dans l’ordre de la liste spécifiée.

print(s[[1, 3]])
print(type(s[[1, 3]]))
# name
# Bob     42
# Dave    68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

print(s[['Bob', 'Dave']])
print(type(s[['Bob', 'Dave']]))
# name
# Bob     42
# Dave    68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

Si une liste avec un élément est spécifiée, pandas.Series est renvoyé.

print(s[[1]])
print(type(s[[1]]))
# name
# Bob    42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

print(s[['Bob']])
print(type(s[['Bob']]))
# name
# Bob    42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

[Slice of label/position] : obtenez un ou plusieurs éléments en tant que pandas.Series

Vous pouvez également sélectionner plusieurs valeurs comme pandas.Series en spécifiant une tranche de label/position. Dans le cas d’un nom d’étiquette, l’élément d’arrêt est inclus.

print(s[1:3])
print(type(s[1:3]))
# name
# Bob        42
# Charlie    18
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

print(s['Bob':'Dave'])
print(type(s['Bob':'Dave']))
# name
# Bob        42
# Charlie    18
# Dave       68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

Si un élément est sélectionné, pandas.Series est renvoyé.

print(s[1:2])
print(type(s[1:2]))
# name
# Bob    42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

print(s['Bob':'Bob'])
print(type(s['Bob':'Bob']))
# name
# Bob    42
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

[Tableau booléen/Série] : obtenir les éléments True en tant que pandas.Series

En spécifiant un tableau booléen (list ou numpy.ndarray) dans [], vous pouvez extraire les éléments True en tant que pandas.Series.

l_bool = [True, False, False, True, True, False]
print(s[l_bool])
# name
# Alice    24
# Dave     68
# Ellen    24
# Name: age, dtype: int64

Une erreur est levée si le nombre d’éléments ne correspond pas.

# print(s[[True, False, False]])
# IndexError: Boolean index has wrong length: 3 instead of 6

Vous pouvez également spécifier le booléen pandas.Series. Les éléments sont extraits en fonction des étiquettes, et non de l’ordre.

s_bool = pd.Series(l_bool, index=reversed(df.index))
print(s_bool)
# Frank       True
# Ellen      False
# Dave       False
# Charlie     True
# Bob         True
# Alice      False
# dtype: bool

print(s[s_bool])
# name
# Bob        42
# Charlie    18
# Frank      30
# Name: age, dtype: int64

Une erreur est générée si le nombre d’éléments ou d’étiquettes ne correspond pas.

s_bool_wrong = pd.Series(l_bool, index=['A', 'B', 'C', 'D', 'E', 'F'])

# print(s[s_bool_wrong])
# IndexingError: Unalignable boolean Series provided as indexer
# (index of the boolean Series and of the indexed object do not match).

Sélectionnez les éléments de pandas.DataFrame

Vous pouvez obtenir la valeur d’un élément de pandas.DataFrame en extrayant pandas.Series de pandas.DataFrame, puis en obtenant la valeur de ce pandas.Series.

print(df['age']['Alice'])
# 24

Vous pouvez également extraire n’importe quel groupe par tranches ou listes.

print(df['Bob':'Dave'][['age', 'point']])
#          age  point
# name               
# Bob       42     92
# Charlie   18     70
# Dave      68     70

Cependant, cette méthode ([…]] […]) est appelée indexation chaînée et peut entraîner un SettingWithCopyWarning lors de l’attribution de valeurs.

Vous pouvez sélectionner des lignes ou des colonnes à la fois avec at, iat, loc ou iloc.

print(df.at['Alice', 'age'])
# 24

print(df.loc['Bob':'Dave', ['age', 'point']])
#          age  point
# name               
# Bob       42     92
# Charlie   18     70
# Dave      68     70

Notez que les noms de ligne et de colonne sont des nombres entiers

Soyez prudent lorsque les noms de ligne et de colonne sont des nombres entiers.

Utilisez le pandas.DataFrame suivant comme exemple.

df = pd.DataFrame([[0, 10, 20], [30, 40, 50], [60, 70, 80]],
                  index=[2, 0, 1], columns=[1, 2, 0])
print(df)
#     1   2   0
# 2   0  10  20
# 0  30  40  50
# 1  60  70  80

Si [valeur scalaire] ou [liste], la valeur spécifiée est considérée comme un nom de colonne.

print(df[0])
# 2    20
# 0    50
# 1    80
# Name: 0, dtype: int64

print(df[[0, 2]])
#     0   2
# 2  20  10
# 0  50  40
# 1  80  70

Si [tranche], la valeur spécifiée est considérée comme un numéro de ligne et non comme un nom de ligne. Les valeurs négatives sont également autorisées.

print(df[:2])
#     1   2   0
# 2   0  10  20
# 0  30  40  50

print(df[-2:])
#     1   2   0
# 0  30  40  50
# 1  60  70  80

Utilisez loc ou iloc pour indiquer clairement s’il s’agit d’un nom (étiquette) ou d’un numéro (position).

print(df.loc[:2])
#    1   2   0
# 2  0  10  20

print(df.iloc[:2])
#     1   2   0
# 2   0  10  20
# 0  30  40  50

Pour les pandas.Série :

s = df[2]
print(s)
# 2    10
# 0    40
# 1    70
# Name: 2, dtype: int64

Dans pandas.Series, la valeur spécifiée est considérée comme une étiquette et non comme un index.

Utilisez at ou iat pour indiquer clairement s’il s’agit d’une étiquette ou d’un index.

print(s.at[0])
# 40

print(s.iat[0])
# 10

Notez que si vous spécifiez [-1], il est considéré comme une étiquette nommée -1, pas la queue. Vous pouvez utiliser iat.

# print(s[-1])
# KeyError: -1

print(s.iat[-1])
# 70

Ainsi, il est préférable d’utiliser at, iat, loc ou iloc lorsque le nom de la ligne ou de la colonne est un entier.