HOWTO · Pandas

Converti Pandas Dataframe in NumPy Array

Converti un DataFrame Pandas in un array NumPy con to_numpy(), includi il suo indice o crea record strutturati con to_records().

In questa pagina

Per ottenere un array NumPy standard, chiama DataFrame.to_numpy(). Se devi mantenere codice meno recente, puoi usare la proprietà legacy DataFrame.values; scegli invece DataFrame.to_records() quando ti servono campi con nome. Gli esempi usano dati fissi e richiedono pandas e NumPy. Un array standard ha un solo dtype, quindi i tipi misti delle colonne possono essere rappresentati con un dtype comune.

Usa DataFrame.to_numpy() per ottenere un array NumPy

to_numpy() restituisce i dati della tabella in un array NumPy bidimensionale. Le righe mantengono l’ordine del DataFrame e le colonne quello delle colonne del DataFrame. La forma dell’array è (number of rows, number of columns); l’indice e le etichette delle colonne del DataFrame non sono inclusi. L’oggetto restituito è un ndarray, quindi può essere passato direttamente alle funzioni NumPy successive.

Questo esempio crea una piccola tabella, converte i suoi valori e stampa l’array, la forma e il tipo del risultato:

import pandas as pd

df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [91, 88]})
array = df.to_numpy()

print(array)
print(array.shape)
print(type(array))
[['Ada' 91]
 ['Lin' 88]]
(2, 2)
<class 'numpy.ndarray'>

Se ti serve un dtype specifico, passalo con dtype= a to_numpy(), per esempio df.to_numpy(dtype="float64"). In questo modo chiedi a NumPy di convertire i valori in quel dtype: scegli un tipo che possa rappresentare i valori di tutte le colonne. Se sono presenti stringhe e numeri, un dtype numerico non può rappresentare ogni valore senza conversione; il dtype comune predefinito può quindi essere object.

Gestisci la proprietà legacy DataFrame.values e includi l’indice

DataFrame.values è una proprietà: accedici senza parentesi. Restituisce i dati tabulari come array, ma to_numpy() rende esplicita la conversione ed è la forma consigliata per il nuovo codice. Il codice esistente che usa values può continuare a leggerlo come attributo.

Per includere i valori dell’indice come colonna, chiama reset_index() prima della conversione. Per impostazione predefinita, reset_index() inserisce il vecchio indice nella prima colonna e crea un nuovo indice intero predefinito. Se vuoi un nome di colonna significativo, rinomina prima l’indice. Consulta reset_index() per le opzioni disponibili.

import pandas as pd

df = pd.DataFrame({"score": [91, 88]}, index=["Ada", "Lin"])

legacy_array = df.values
with_index = df.reset_index().to_numpy()

print(legacy_array)
print(with_index)
[[91]
 [88]]
[['Ada' 91]
 ['Lin' 88]]

Poiché le etichette dell’indice sono stringhe mentre i valori dei punteggi sono interi, l’array standard deve usare un dtype comune e può avere dtype object. L’indice è presente solo dopo reset_index(); convertendo il DataFrame originale, le sue etichette restano escluse. Se devi mantenere accessibili i tipi e i nomi distinti delle colonne, usa un array di record strutturato.

Usa DataFrame.to_records() per ottenere un array NumPy strutturato

to_records() restituisce un array NumPy strutturato con un campo denominato per ogni colonna del DataFrame. Per impostazione predefinita, include anche l’indice in un campo chiamato index. L’accesso ai campi consente di individuare le colonne tramite il nome, mentre il dtype strutturato ne registra i singoli tipi. È utile quando il codice deve selezionare un campo per nome invece di basarsi sulla sua posizione nella colonna.

import pandas as pd

df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [91, 88]})
records = df.to_records()

print(records["name"])
print(records["score"])
print(records.dtype.names)
['Ada' 'Lin']
[91 88]
('index', 'name', 'score')

Imposta index=False per escludere l’indice oppure specifica index_dtypes= se devi definire il dtype del campo dell’indice. Scegli to_numpy() per un array convenzionale e to_records() quando il compito richiede campi con nome o informazioni sul dtype di ciascuna colonna.