HOWTO · Pandas

Comment convertir Pandas Dataframe en NumPy array

Convertissez un DataFrame Pandas en tableau NumPy avec to_numpy(), incluez son index ou créez des enregistrements structurés avec to_records().

Sur cette page

Pour obtenir un tableau NumPy classique, appelez DataFrame.to_numpy(). Si vous maintenez du code ancien, vous pouvez utiliser la propriété DataFrame.values ; choisissez DataFrame.to_records() lorsque des champs nommés sont utiles. Les exemples utilisent des données fixes et nécessitent pandas et NumPy. Un tableau classique n’a qu’un seul type de données : des colonnes de types différents peuvent donc être converties vers un type commun.

Utiliser DataFrame.to_numpy() pour obtenir un tableau NumPy

to_numpy() renvoie les données du tableau sous la forme d’un tableau NumPy à deux dimensions. Les lignes conservent l’ordre du DataFrame, tout comme les colonnes. La forme du tableau est (number of rows, number of columns) ; ni l’index du DataFrame ni les étiquettes de colonnes ne sont inclus. L’objet renvoyé est un ndarray, que les fonctions NumPy peuvent donc utiliser directement.

Cet exemple crée un petit tableau, convertit ses valeurs, puis affiche le tableau, sa forme et le type de l’objet obtenu :

import pandas as pd

df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [91, 88]})
array = df.to_numpy()

print(array)
print(array.shape)
print(type(array))
[['Ada' 91]
 ['Lin' 88]]
(2, 2)
<class 'numpy.ndarray'>

Si vous avez besoin d’un type de données particulier, transmettez dtype= à to_numpy(), par exemple df.to_numpy(dtype="float64"). NumPy convertit alors les valeurs vers ce type ; choisissez-en un qui puisse représenter les valeurs de toutes les colonnes. Avec des chaînes et des nombres mélangés, un type numérique ne peut pas représenter chaque valeur sans conversion ; le type commun choisi par défaut peut donc être object.

Gérer l’ancienne propriété DataFrame.values et inclure l’index

DataFrame.values est une propriété : accédez-y sans parenthèses. Elle renvoie les données tabulaires sous forme de tableau, mais to_numpy() rend la conversion explicite et constitue la forme recommandée dans le nouveau code. Le code existant qui utilise values peut continuer à y accéder comme à un attribut.

Pour inclure les valeurs de l’index dans une colonne, appelez reset_index() avant la conversion. Par défaut, reset_index() place l’ancien index dans la première colonne et crée un nouvel index entier par défaut. Renommez d’abord l’index si vous souhaitez donner un nom explicite à cette colonne. Consultez reset_index() pour connaître ses options.

import pandas as pd

df = pd.DataFrame({"score": [91, 88]}, index=["Ada", "Lin"])

legacy_array = df.values
with_index = df.reset_index().to_numpy()

print(legacy_array)
print(with_index)
[[91]
 [88]]
[['Ada' 91]
 ['Lin' 88]]

Comme les étiquettes de l’index sont des chaînes alors que les scores sont des entiers, le tableau classique doit utiliser un type commun et peut donc être de type object. L’index n’est présent qu’après l’appel à reset_index() ; la conversion du DataFrame d’origine n’inclut pas ses étiquettes. Utilisez un tableau structuré de type record si vous devez conserver l’accès aux types et aux noms distincts des colonnes.

Utiliser DataFrame.to_records() pour obtenir un tableau NumPy structuré

to_records() renvoie un tableau NumPy structuré, avec un champ nommé pour chaque colonne du DataFrame. Par défaut, il inclut également l’index dans un champ nommé index. L’accès aux champs permet de retrouver les colonnes par leur nom, et le type structuré conserve leurs types individuels. Cette forme est utile lorsque le code doit sélectionner un champ par son nom plutôt que par sa position dans les colonnes.

import pandas as pd

df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [91, 88]})
records = df.to_records()

print(records["name"])
print(records["score"])
print(records.dtype.names)
['Ada' 'Lin']
[91 88]
('index', 'name', 'score')

Définissez index=False pour exclure l’index, ou transmettez index_dtypes= si vous devez préciser le type du champ d’index. Choisissez to_numpy() pour obtenir un tableau classique et to_records() lorsque la tâche nécessite des champs nommés ou des informations de type propres à chaque colonne.