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


264

Savez-vous comment obtenir l'index ou la colonne d'un DataFrame en tant que tableau NumPy ou liste python?



Est-ce que cela répond à votre question? Convertir la trame de données pandas en tableau NumPy
AMC

1
REMARQUE: Devoir convertir Pandas DataFrame en un tableau (ou une liste) comme celui-ci peut indiquer d'autres problèmes. Je recommande fortement de s'assurer qu'un DataFrame est la structure de données appropriée pour votre cas d'utilisation particulier et que Pandas n'inclut aucun moyen d'effectuer les opérations qui vous intéressent.
AMC

Réponses:


354

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

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 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 autres 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', 'c']

Et de même, pour les colonnes.


Remarque: .valuesest obsolète, .to_numpy()est le remplacement suggéré si vous voulez un tableau NumPy. Pouvez-vous développer Cela accède à la façon dont les données sont déjà stockées, donc il n'y a pas besoin de conversion ?
AMC

La réponse par cs95 donne une grande explication de .values, .to_numpy()et .array.
AMC

75

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


Il renvoie instanceMethod et non un tableau de liste
V Shreyas

12
@VShreyas, que diriez-vousdf.index.values.tolist()
LancelotHolmes

3
df.index.tolist()ne renvoie pas de méthode d'instance. Il renvoie une liste d'indices. Il s'agit d'une méthode définie sur index pandas. Bien que l'appel de valeurs en premier soit une possibilité, déléguer le travail à numpy n'est pas une correction - juste une alternative.
ayhan

51

pandas> = 0,24

Dépréciez votre utilisation de .valuesau profit de ces méthodes!

A partir de v0.24.0 partir, nous aurons deux nouvelles méthodes préférées pour obtenir la fessée marque tableaux numpy à partir Index, Serieset les DataFrameobjets: ils sont to_numpy(), et .array. Concernant l'utilisation, les documents mentionnent:

Nous n'avons pas supprimé ou déprécié Series.valuesou DataFrame.values, mais nous recommandons fortement d'utiliser .arrayou à la .to_numpy()place.

Consultez cette section des notes de mise à jour 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 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 les DataFrames (mais .arraypas).


arrayAttribut
Cet attribut renvoie unExtensionArrayobjet 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

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 appelez directement .tolist():

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

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

Concernant ce qui est retourné, les documents mentionnent,

Pour Serieset Indexes soutenu par des tableaux NumPy normaux, Series.array renverra un nouveau arrays.PandasArray, qui est un wrapper fin (sans copie) autour de a numpy.ndarray. arrays.PandasArrayn'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.

Donc, pour résumer, .arrayreviendra soit

  1. Le ExtensionArraysupport existant de l'Indice / de la Série, ou
  2. S'il existe un tableau NumPy soutenant la série, un nouvel ExtensionArrayobjet est créé en tant que wrapper 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 sous deux problèmes GitHub GH19954 et GH23623 .

Plus précisément, les documents mentionnent la justification:

[...] avec .valuesil n'était pas clair si la valeur retournée serait le tableau réel, une transformation de celui-ci, ou l'un des tableaux personnalisés pandas (comme Categorical). Par exemple, avec PeriodIndex, .values génère à ndarraychaque fois un nouvel objet période. [...]

Ces deux fonctions visent à améliorer la cohérence de l'API, ce qui constitue une étape majeure dans la bonne direction.

Enfin, .valuesne sera pas déconseillé dans la version actuelle, mais je m'attends à ce que cela se produise à un moment donné dans le futur, donc j'exhorte les utilisateurs à migrer vers la nouvelle API, dès que vous le pouvez.


48

Si vous avez affaire à une trame 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 comme

df.index.get_level_values('name_sub_index')

et bien sûr name_sub_indexdoit être un élément de laFrozenList df.index.names


16

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

df.index.get_values()

5
Y a-t-il une différence entre ceci et .valeurs? (J'ai mis à jour les informations de version, car cette fonction apparaît à partir des documents 0.13.0.)
Andy Hayden

@Andy Hayden: N'est-ce pas une différence que .get_values ​​est le moyen officiel d'obtenir uniquement les valeurs actuelles alors que .values ​​(par exemple sur un multi-index) peut retourner des valeurs d'index pour lesquelles les lignes ou les colonnes ont été supprimées?
Ezekiel Kruglick

@EzekielKruglick donc c'est toujours une copie? Le lien avec la documentation est très léger, je ne pensais pas que vous obtenez des dupes comme ça (même s'ils sont dans le MI, ils ne seront pas dans les valeurs.) Serait génial de voir un exemple qui le démontre!
Andy Hayden du

@AndyHayden: Je pense que j'ai mal lu votre commentaire. Vous avez raison, .values ​​est bon, .level donne obsolète et get_values ​​vous donne les valeurs actuelles correctement en excluant les lignes / colonnes supprimées. Problème github original: github.com/pydata/pandas/issues/3686 Mais je viens de vérifier et il semble que .values ​​(bien sûr!) Donne des informations à jour juste sous une forme différente de ce que je pensais être ce dont nous parlions
Ezekiel Kruglick

1
@AndyHayden Non, il n'y a pas de différence. get_valuesappelle juste .values. Il y a plus de caractères à taper.
cs95

0

J'ai converti les pandas dataframeen listpuis utilisé le basique list.index(). Quelque chose comme ça:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

Vous avez votre valeur d'index en tant que idx.


puis utilisé le list.index () de base Comment est-ce lié à la question de la conversion d'une série en liste?
AMC

0

Une façon plus récente de procéder consiste à utiliser la fonction .to_numpy ().

Si j'ai une trame de données avec une colonne 'prix', je peux la convertir comme suit:

priceArray = df['price'].to_numpy()

Vous pouvez également passer le type de données, tel que float ou object, comme argument de la fonction


-1

Vous trouverez ci-dessous un moyen simple de convertir une colonne de trame de données 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 cela m'a donné l'erreur ci-dessous: TypeError: aucune conversion prise en charge pour les types: (dtype ('O'),) lors de la classification de pertinence binaire en utilisant SVC linéaire. to.numpy () convertissait le dataFrame en tableau numpy mais le type de données de l'élément interne était list à cause duquel l'erreur ci-dessus a été observée.


J'ai essayé avec to.numpy () mais cela m'a donné l'erreur ci-dessous: TypeError: aucune conversion prise en charge pour les types: (dtype ('O'),) lors de la classification de pertinence binaire à l'aide de SVC linéaire. to.numpy () convertissait le dataFrame en tableau numpy mais le type de données de l'élément interne était list à cause duquel l'erreur ci-dessus a été observée. Ce n'est pas vraiment la faute to_numpy, cependant.
AMC
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.