Dépréciez votre utilisation de valueset as_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 sur Index, Series,et les DataFrameobjets, et
array, qui est défini sur Indexet Seriesuniquement sur les objets.
Si vous visitez la documentation de v0.24 pour .values, vous verrez un gros avertissement rouge qui dit:
Avertissement: nous vous recommandons d'utiliser à la DataFrame.to_numpy()place.
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_numpya été introduite pour extraire le tableau NumPy sous-jacent des DataFrames.
# Setup.
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c'])
df.to_numpy()
array([[1, 4],
[2, 5],
[3, 6]])
Comme mentionné ci-dessus, cette méthode est également définie sur les objets Indexet Series(voir ici ).
df.index.to_numpy()
# array(['a', 'b', 'c'], dtype=object)
df['A'].to_numpy()
# array([1, 2, 3])
Par défaut, une vue est retournée, donc toutes les modifications apportées affecteront l'original.
v = df.to_numpy()
v[0, 0] = -1
df
A B
a -1 4
b 2 5
c 3 6
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.
a = pd.array([1, 2, None], dtype="Int64")
a
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64
# Wrong
a.to_numpy()
# array([1, 2, <NA>], dtype=object) # yuck, objects
# Right
a.to_numpy(dtype='float', na_value=np.nan)
# array([ 1., 2., nan])
Ceci est mentionné dans les documents .
Si vous avez besoin du dtypes...
Comme indiqué dans une autre réponse, DataFrame.to_recordsest un bon moyen de le faire.
df.to_records()
# rec.array([('a', -1, 4), ('b', 2, 5), ('c', 3, 6)],
# dtype=[('index', 'O'), ('A', '<i8'), ('B', '<i8')])
Cela ne peut to_numpymalheureusement pas être fait avec . Cependant, comme alternative, vous pouvez utiliser np.rec.fromrecords:
v = df.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
# rec.array([('a', -1, 4), ('b', 2, 5), ('c', 3, 6)],
# dtype=[('index', '<U1'), ('A', '<i8'), ('B', '<i8')])
En termes de performances, c'est presque la même chose (en fait, l'utilisation rec.fromrecordsest un peu plus rapide).
df2 = pd.concat([df] * 10000)
%timeit df2.to_records()
%%timeit
v = df2.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
11.1 ms ± 557 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.67 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Justification de l'ajout d'une nouvelle méthode
to_numpy()(en plus de array) a été ajouté à la suite de discussions sur 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. [...]
to_numpyvisent à améliorer la cohérence de l'API, ce qui constitue une étape importante dans la bonne direction. .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 possible.
Critique des autres solutions
DataFrame.values a un comportement incohérent, comme déjà noté.
DataFrame.get_values()est simplement un wrapper DataFrame.values, donc tout ce qui précède s'applique.
DataFrame.as_matrix()est obsolète maintenant, ne l' utilisez PAS !