web-dev-qa-db-fra.com

Comment convertir une série pandas ou un index en tableau Numpy?

Savez-vous comment obtenir l'index ou la colonne d'un DataFrame sous la forme d'un tableau NumPy ou d'une liste python?

242
ericmjl

Pour obtenir un tableau NumPy, vous devez utiliser l'attribut values:

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)

Ceci accède à la façon dont les données sont déjà stockées, il n'y a donc pas besoin de conversion.
Remarque: cet attribut est également disponible pour de nombreux objets de 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']

Et de même, pour les colonnes.

333
Andy Hayden

Vous pouvez utiliser df.index pour accéder à l'objet index, puis 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.

74
bdiamante

Si vous traitez avec une structure de données multi-index, vous voudrez peut-être extraire uniquement la colonne d'un nom du multi-index. Vous pouvez le faire comme

df.index.get_level_values('name_sub_index')

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

46
gg349

Actuel à partir de v0.24.0 + , 2019.

Déconseillez votre utilisation de _.values_ en faveur de ces méthodes!

À partir de la v0.24.0, nous aurons deux nouvelles méthodes préférées pour obtenir des tableaux NumPy à partir des objets Index, Series et DataFrame: ce sont to_numpy() et .array. En ce qui concerne l'utilisation, la documentation mentionne:

Nous n’avons ni supprimé ni obsolète _Series.values_ ou _DataFrame.values_, mais , nous vous recommandons vivement d’utiliser _.array_ ou .to_numpy() à la place.

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


méthode to_numpy()

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

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

Par défaut, une vue est retourné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 plutôt 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 DataFrames (contrairement à _.array_).


attribut array
Cet attribut retourne un objet ExtensionArray qui sauvegarde l'index/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 simplement appeler directement .tolist():

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

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

En ce qui concerne ce qui est retourné, les docs mentionnent,

Pour Series et Indexes soutenus par des tableaux NumPy normaux, _Series.array_ renverra un nouveau _arrays.PandasArray_, qui est un encapsuleur fin (sans copie) autour de _numpy.ndarray_. _arrays.PandasArray_ n’est pas particulièrement utile en soi, mais fournit la même interface que n’importe quel tableau d’extensions défini dans pandas ou par une bibliothèque tierce.

Donc, pour résumer, _.array_ retournera soit

  1. Le ExtensionArray existant qui sauvegarde l’index/la série, ou
  2. Si un tableau NumPy sauvegarde la série, un nouvel objet ExtensionArray est créé en tant qu'encapsuleur mince sur le 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 concernant GitHub GH19954 et GH2362 .

Plus précisément, les docs mentionnent le raisonnement suivant:

[...] avec _.values_ il n'était pas clair si la valeur renvoyée serait le tableau réel, une transformation de celui-ci ou l'un des pandas tableaux personnalisés (comme Categorical). Par exemple, avec PeriodIndex, _.values_ génère chaque fois un nouvel objet ndarray of period. [...]

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

Enfin, _.values_ ne sera pas obsolète dans la version actuelle, mais je suppose que cela pourrait se produire à l'avenir. J'invite donc les utilisateurs à migrer vers la nouvelle API dès que possible.

31
cs95

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

_df.index.get_values()
_
16
yemu

Vous trouverez ci-dessous un moyen simple de convertir une colonne dataframe en tableau numpy.

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpy est un tableau numpy.

J'ai essayé avec to.numpy() mais il m'a donné l'erreur ci-dessous: TypeError: aucune conversion prise en charge pour les types: (dtype ('O'),) tout en effectuant la classfication de pertinence binaire à l'aide de SVC linéaire. to.numpy () était en train de convertir dataFrame en tableau numpy mais le type de données de l'élément interne était list en raison de l'erreur observée ci-dessus.

0
Kumar Shubham