Je suis intéressé à savoir comment convertir une trame de données pandas en un tableau NumPy.
trame de données:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
donne
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
Je voudrais convertir cela en un tableau NumPy, comme suit:
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
Comment puis-je faire ceci?
En bonus, est-il possible de conserver les dtypes, comme ça?
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
ou similaire?
Réponses:
Pour convertir une trame de données pandas (df) en un ndarray numpy, utilisez ce code:
la source
Dépréciez votre utilisation de
values
etas_matrix()
!pandas v0.24.0 a introduit deux nouvelles méthodes pour obtenir des tableaux NumPy à partir d'objets pandas:
to_numpy()
, qui est défini surIndex
,Series,
et lesDataFrame
objets, etarray
, qui est défini surIndex
etSeries
uniquement sur les objets.Si vous visitez la documentation de v0.24 pour
.values
, vous verrez un gros avertissement rouge qui dit:Consultez cette section des notes de mise à jour v0.24.0 et cette réponse pour plus d'informations.
Vers une meilleure cohérence:
to_numpy()
Dans un esprit de meilleure cohérence à travers l'API, une nouvelle méthode
to_numpy
a été introduite pour extraire le tableau NumPy sous-jacent des DataFrames.Comme mentionné ci-dessus, cette méthode est également définie sur les objets
Index
etSeries
(voir ici ).Par défaut, une vue est retournée, donc toutes les modifications apportées affecteront l'original.
Si vous avez plutôt besoin d'une copie, utilisez
to_numpy(copy=True
).pandas> = 1.0 mise à jour pour ExtensionTypes
Si vous utilisez pandas 1.x, il y a de fortes chances que vous ayez beaucoup plus à faire avec les types d'extension. Vous devrez faire un peu plus attention à ce que ces types d'extensions soient correctement convertis.
Ceci est mentionné dans les documents .
Si vous avez besoin du
dtypes
...Comme indiqué dans une autre réponse,
DataFrame.to_records
est un bon moyen de le faire.Cela ne peut
to_numpy
malheureusement pas être fait avec . Cependant, comme alternative, vous pouvez utilisernp.rec.fromrecords
:En termes de performances, c'est presque la même chose (en fait, l'utilisation
rec.fromrecords
est un peu plus rapide).Justification de l'ajout d'une nouvelle méthode
to_numpy()
(en plus dearray
) a été ajouté à la suite de discussions sur deux problèmes GitHub GH19954 et GH23623 .Plus précisément, les documents mentionnent la justification:
to_numpy
visent à améliorer la cohérence de l'API, ce qui constitue une étape importante dans la bonne direction..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 possible.Critique des autres solutions
DataFrame.values
a un comportement incohérent, comme déjà noté.DataFrame.get_values()
est simplement un wrapperDataFrame.values
, donc tout ce qui précède s'applique.DataFrame.as_matrix()
est obsolète maintenant, ne l' utilisez PAS !la source
as_matrix
une autre solution, dans ce cas,to_numpy
sans expliquer comment récupérer la fonctionnalité de sélection de colonne deas_matrix
! Je suis sûr qu'il existe d'autres façons de sélectionner des colonnes, maisas_matrix
c'était au moins l'une d'entre elles!df[[col1, col2']].to_numpy()
? Je ne sais pas pourquoi vous pensez vouloir annoncer une alternative mise à jour à une fonction obsolète mérite un downvote sur la réponse.Remarque : La
.as_matrix()
méthode utilisée dans cette réponse est obsolète. Pandas 0.23.4 prévient:Pandas a quelque chose de intégré ...
donne
la source
object
.to_numpy
place (pas non.values
plus). Plus ici .Je voudrais simplement enchaîner les fonctions DataFrame.reset_index () et DataFrame.values pour obtenir la représentation Numpy de la trame de données, y compris l'index:
Pour obtenir les dtypes, nous aurions besoin de transformer ce ndarray en un tableau structuré en utilisant view :
la source
Vous pouvez utiliser la
to_records
méthode, mais devez jouer un peu avec les dtypes s'ils ne sont pas ce que vous voulez dès le départ. Dans mon cas, après avoir copié votre DF à partir d'une chaîne, le type d'index est chaîne (représenté par unobject
dtype dans pandas):La conversion du dtype recarray ne fonctionne pas pour moi, mais on peut déjà le faire dans Pandas:
Notez que Pandas ne définit pas le nom de l'index correctement (à
ID
) dans le tableau d'enregistrement exporté (un bug?), Nous profitons donc de la conversion de type pour corriger également cela.Pour le moment, Pandas n'a que des entiers de 8 octets
i8
, et flotte,f8
(voir ce numéro ).la source
np.array
constructeur.Il semble que
df.to_records()
cela fonctionnera pour vous. La fonctionnalité exacte que vous recherchez a été demandée etto_records
indiquée comme alternative.J'ai essayé cela localement en utilisant votre exemple, et cet appel donne quelque chose de très similaire à la sortie que vous cherchiez:
Notez qu'il s'agit
recarray
plutôt d'unarray
. Vous pouvez déplacer le résultat dans un tableau numpy normal en appelant son constructeur asnp.array(df.to_records())
.la source
to_records()
plus de 5 ans plus tôt?Essaye ça:
la source
Voici mon approche pour créer un tableau de structure à partir d'un DataFrame pandas.
Créer le bloc de données
Définissez la fonction pour créer un tableau de structure numpy (pas un tableau d'enregistrement) à partir d'un DataFrame pandas.
Permet
reset_index
de créer un nouveau bloc de données qui inclut l'index dans ses données. Convertissez ce bloc de données en un tableau de structure.EDIT: mise à jour de df_to_sarray pour éviter une erreur lors de l'appel de .encode () avec python 3. Merci à Joseph Garvin et halcyon pour leurs commentaires et leur solution.
la source
Deux façons de convertir la trame de données en sa représentation Numpy-array.
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
Doc: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html
la source
Un moyen plus simple pour exemple DataFrame:
UTILISATION:
AVOIR:
la source
Juste eu un problème similaire lors de l'exportation de la trame de données vers la table arcgis et suis tombé sur une solution des usgs ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ). Bref, votre problème a une solution similaire:
la source
J'ai parcouru les réponses ci-dessus. La méthode " as_matrix () " fonctionne mais est désormais obsolète. Pour moi, ce qui a fonctionné était " .to_numpy () ".
Cela renvoie un tableau multidimensionnel. Je préfère utiliser cette méthode si vous lisez des données à partir d'une feuille Excel et que vous devez accéder aux données de n'importe quel index. J'espère que cela t'aides :)
la source
Suite à la réponse de météore, j'ai trouvé le code
ne fonctionne pas pour moi. J'ai donc mis mon code ici pour la commodité des autres coincés avec ce problème.
la source
Un moyen simple de convertir la trame de données en tableau numpy:
L'utilisation de to_numpy est encouragée pour préserver la cohérence.
Référence: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html
la source
Essaye ça:
Plus d'informations sur: [ https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html] Valable pour numpy 1.16.5 et pandas 0.25.2.
la source