Dépréciez votre utilisation de values
et 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 DataFrame
objets, et
array
, qui est défini sur Index
et Series
uniquement 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_numpy
a é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 Index
et 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_records
est 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_numpy
malheureusement 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.fromrecords
est 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 .values
il 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 à ndarray
chaque fois un nouvel objet période. [...]
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 wrapper DataFrame.values
, donc tout ce qui précède s'applique.
DataFrame.as_matrix()
est obsolète maintenant, ne l' utilisez PAS !