298 votes

Comment convertir une série ou un index Pandas en tableau NumPy ?

Comment obtenir l'index ou la colonne d'un DataFrame sous la forme d'un tableau NumPy ou d'une liste Python ?

378voto

Andy Hayden Points 38010

Pour obtenir un tableau NumPy, vous devez utiliser la fonction values attribut :

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

Cela permet d'accéder à la manière dont les données sont déjà stockées, de sorte qu'il n'est pas nécessaire de les convertir.

Note : Cet attribut est également disponible pour de nombreux autres objets pandas.

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

Pour obtenir l'index sous forme de liste, appelez tolist :

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

Il en va de même pour les colonnes.

75voto

bdiamante Points 6542

Vous pouvez utiliser df.index pour accéder à l'objet index et obtenir les valeurs dans une liste à l'aide de df.index.tolist() . De même, vous pouvez utiliser df['col'].tolist() pour la série.

70voto

coldspeed Points 111053

Pandas >= 0.24

Déclassez votre utilisation de .values en faveur de ces méthodes !

A partir de la version 0.24.0, nous aurons deux nouvelles méthodes préférées pour obtenir des tableaux NumPy à partir de Index , Series y DataFrame objets : ils sont to_numpy() y .array . En ce qui concerne l'utilisation, les documents mentionnent :

Nous n'avons pas supprimé ou déprécié Series.values ou DataFrame.values mais nous recommandons vivement d'utiliser .array ou .to_numpy() au lieu de cela.

Voir cette section des notes de version v0.24.0 pour plus d'informations.


to_numpy() Méthode

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

Par défaut, une vue est renvoyée. Toute modification apportée affectera l'original.

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

Si vous avez besoin d'une copie, utilisez to_numpy(copy=True ) ;

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

Notez que cette fonction fonctionne également pour les Cadres de données (alors que .array ne le fait pas).


array Attribut
Cet attribut renvoie un ExtensionArray qui soutient l'indice/la série.

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

<!- ->

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

A partir de là, il est possible d'obtenir une liste en utilisant list :

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

ou appeler directement .tolist() :

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

Les documents mentionnent ce qui est renvoyé,

Pour Series et Index s'appuient sur des tableaux NumPy normaux, Series.array renverra un nouveau arrays.PandasArray qui est un fichier fin (sans copie) autour d'un numpy.ndarray . arrays.PandasArray n'est pas particulièrement n'est pas particulièrement utile en soi, mais il fournit la même interface que n'importe quel tableau d'extension défini dans pandas ou par une bibliothèque tierce. défini dans pandas ou par une bibliothèque tierce.

En résumé, .array renvoie soit

  1. Le système existant ExtensionArray en revenant sur l'indice/la série, ou
  2. S'il y a un tableau NumPy qui soutient la série, un nouveau fichier ExtensionArray est créé comme une enveloppe fine au-dessus du tableau sous-jacent.

Justification de l'ajout de DEUX nouvelles méthodes
Ces fonctions ont été ajoutées à la suite de discussions dans le cadre de deux problèmes GitHub GH19954 et GH23623 .

Plus précisément, les documents mentionnent la raison d'être :

[...] avec .values il n'était pas clair si la valeur renvoyée serait le tableau, une transformation de celui-ci, ou l'un des tableaux personnalisés de pandas de pandas (comme Categorical ). Par exemple, avec PeriodIndex , .values génère un nouveau ndarray des objets de la période à chaque fois. [...]

Ces deux fonctions visent à améliorer la cohérence de l'API, ce qui constitue un grand pas dans la bonne direction.

Enfin, .values ne sera pas obsolète dans la version actuelle, mais je m'attends à ce que cela se produise à un moment donné dans l'avenir, et j'invite donc les utilisateurs à migrer vers la nouvelle API, dès que possible.

49voto

Giulio Ghirardo Points 3742

Si vous avez affaire à un tableau de données multi-index, il peut être intéressant d'extraire uniquement la colonne d'un nom du multi-index. Vous pouvez le faire sous la forme suivante

df.index.get_level_values('name_sub_index')

et bien sûr name_sub_index doit être un élément de la FrozenList df.index.names

16voto

yemu Points 1054

Depuis pandas v0.13, vous pouvez également utiliser get_values :

df.index.get_values()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X