Comment obtenir l'index ou la colonne d'un DataFrame sous la forme d'un tableau NumPy ou d'une liste Python ?
Réponses
Trop de publicités?Pour obtenir un tableau NumPy, vous devez utiliser la fonction values
attribut :
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 manière dont les données sont déjà stockées, de sorte qu'il n'est pas nécessaire de les convertir.
Note : Cet attribut est également disponible pour de nombreux autres objets 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']
Il en va de même pour les colonnes.
Pandas >= 0.24
Déclassez votre utilisation de .values
en faveur de ces méthodes !
A partir de la version 0.24.0, nous aurons deux nouvelles méthodes préférées pour obtenir des tableaux NumPy à partir de Index
, Series
y DataFrame
objets : ils sont to_numpy()
y .array
. En ce qui concerne l'utilisation, les documents mentionnent :
Nous n'avons pas supprimé ou déprécié
Series.values
ouDataFrame.values
mais nous recommandons vivement d'utiliser.array
ou.to_numpy()
au lieu de cela.
Voir cette section des notes de version v0.24.0 pour plus d'informations.
df.index.to_numpy()
# array(['a', 'b'], dtype=object)
df['A'].to_numpy()
# array([1, 4])
Par défaut, une vue est renvoyé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 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 Cadres de données (alors que .array
ne le fait pas).
array
Attribut
Cet attribut renvoie un ExtensionArray
qui soutient l'indice/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
A partir 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 appeler directement .tolist()
:
df.index.tolist()
# ['a', 'b']
df['A'].tolist()
# [1, 4]
Les documents mentionnent ce qui est renvoyé,
Pour
Series
etIndex
s'appuient sur des tableaux NumPy normaux,Series.array
renverra un nouveauarrays.PandasArray
qui est un fichier fin (sans copie) autour d'unnumpy.ndarray
.arrays.PandasArray
n'est pas particulièrement n'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. défini dans pandas ou par une bibliothèque tierce.
En résumé, .array
renvoie soit
- Le système existant
ExtensionArray
en revenant sur l'indice/la série, ou - S'il y a un tableau NumPy qui soutient la série, un nouveau fichier
ExtensionArray
est créé comme une enveloppe fine au-dessus du tableau sous-jacent.
Justification de l'ajout de DEUX nouvelles méthodes
Ces fonctions ont été ajoutées à la suite de discussions dans le cadre de deux problèmes GitHub GH19954 et GH23623 .
Plus précisément, les documents mentionnent la raison d'être :
[...] avec
.values
il n'était pas clair si la valeur renvoyée serait le tableau, une transformation de celui-ci, ou l'un des tableaux personnalisés de pandas de pandas (commeCategorical
). Par exemple, avecPeriodIndex
,.values
génère un nouveaundarray
des objets de la période à chaque fois. [...]
Ces deux fonctions visent à améliorer la cohérence de l'API, ce qui constitue un grand pas dans la bonne direction.
Enfin, .values
ne sera pas obsolète dans la version actuelle, mais je m'attends à ce que cela se produise à un moment donné dans l'avenir, et j'invite donc les utilisateurs à migrer vers la nouvelle API, dès que possible.
Si vous avez affaire à un tableau 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 sous la forme suivante
df.index.get_level_values('name_sub_index')
et bien sûr name_sub_index
doit être un élément de la FrozenList
df.index.names
Depuis pandas v0.13, vous pouvez également utiliser get_values
:
df.index.get_values()
- Réponses précédentes
- Plus de réponses