
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.