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 14
b 25
c 36In[2]: df.index.valuesOut[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.
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.
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
Le ExtensionArraysupport existant de l'Indice / de la Série, ou
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.
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 laFrozenListdf.index.names
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 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.
Réponses:
Pour obtenir un tableau NumPy, vous devez utiliser l'
values
attribut: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.
Pour obtenir l'index sous forme de liste, appelez
tolist
:Et de même, pour les colonnes.
la source
.values
est 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 ?.values
,.to_numpy()
et.array
.Vous pouvez utiliser
df.index
pour accéder à l'objet d'index, puis récupérer les valeurs dans une liste à l'aide dedf.index.tolist()
. De même, vous pouvez utiliserdf['col'].tolist()
pour la série.la source
df.index.values.tolist()
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.pandas> = 0,24
Dépréciez votre utilisation de
.values
au 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
,Series
et lesDataFrame
objets: ils sontto_numpy()
, et.array
. Concernant l'utilisation, les documents mentionnent:Consultez cette section des notes de mise à jour v0.24.0 pour plus d'informations.
to_numpy()
MéthodePar défaut, une vue est retournée. Toute modification apportée affectera l'original.
Si vous avez plutôt besoin d'une copie, utilisez
to_numpy(copy=True
);Notez que cette fonction fonctionne également pour les DataFrames (mais
.array
pas).array
AttributCet attribut renvoie un
ExtensionArray
objet qui sauvegarde l'index / la série.De là, il est possible d'obtenir une liste en utilisant
list
:ou appelez directement
.tolist()
:Concernant ce qui est retourné, les documents mentionnent,
Donc, pour résumer,
.array
reviendra soitExtensionArray
support existant de l'Indice / de la Série, ouExtensionArray
objet 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:
Ces deux fonctions visent à améliorer la cohérence de l'API, ce qui constitue une étape majeure dans la bonne direction.
Enfin,
.values
ne 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.la source
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
et bien sûr
name_sub_index
doit être un élément de laFrozenList
df.index.names
la source
Depuis pandas v0.13, vous pouvez également utiliser
get_values
:la source
get_values
appelle juste.values
. Il y a plus de caractères à taper.J'ai converti les pandas
dataframe
enlist
puis utilisé le basiquelist.index()
. Quelque chose comme ça:Vous avez votre valeur d'index en tant que
idx
.la source
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:
Vous pouvez également passer le type de données, tel que float ou object, comme argument de la fonction
la source
Vous trouverez ci-dessous un moyen simple de convertir une colonne de trame de données en tableau numpy.
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.la source
to_numpy
, cependant.