Come posso convertire una serie panda o un indice in un array Numpy?


264

Sai come ottenere l'indice o la colonna di un DataFrame come un array NumPy o un elenco Python?



Questo risponde alla tua domanda? Converti frame di dati Panda in array NumPy
AMC

1
NOTA: Dover convertire Pandas DataFrame in un array (o elenco) come questo può essere indicativo di altri problemi. Consiglio vivamente di garantire che un DataFrame sia la struttura di dati appropriata per il tuo particolare caso d'uso e che Pandas non includa alcun modo di eseguire le operazioni che ti interessano.
AMC

Risposte:


354

Per ottenere un array NumPy, è necessario utilizzare l' valuesattributo:

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)

Questo accede al modo in cui i dati sono già memorizzati, quindi non è necessaria una conversione.
Nota: questo attributo è disponibile anche per molti altri oggetti di Panda.

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

Per ottenere l'indice come elenco, chiama tolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

E allo stesso modo, per le colonne.


Nota: .valuesè obsoleto, .to_numpy()è la sostituzione suggerita se si desidera un array NumPy. Puoi espanderci su Questo accede al modo in cui i dati sono già memorizzati, quindi non è necessaria una conversione ?
AMC

La risposta di CS95 fornisce una grande spiegazione di .values, .to_numpy()e .array.
AMC

75

È possibile utilizzare df.indexper accedere all'oggetto indice e quindi ottenere i valori in un elenco utilizzando df.index.tolist(). Allo stesso modo, è possibile utilizzare df['col'].tolist()per la serie.


Restituisce instanceMethod e non una matrice di elenco
V Shreyas,

12
@VShreyas, come sudf.index.values.tolist()
LancelotHolmes

3
df.index.tolist()non restituisce un metodo di istanza. Restituisce un elenco di indici. È un metodo definito sull'indice panda. Mentre chiamare i valori per primi è una possibilità, delegare il lavoro a numpy non è una correzione, ma solo un'alternativa.
ayhan,

51

panda> = 0,24

Deprecare il tuo utilizzo .valuesa favore di questi metodi!

Da v0.24.0 in poi, avremo due nuovi metodi preferiti zecca per ottenere matrici NumPy da Index, Seriese DataFrameoggetti: sono to_numpy(), e .array. Per quanto riguarda l'utilizzo, i documenti menzionano:

Non abbiamo rimosso o deprecato Series.valueso DataFrame.values, ma consigliamo vivamente e utilizzare .arrayo .to_numpy()invece.

Vedere questa sezione delle note sulla versione v0.24.0 per ulteriori informazioni.


to_numpy() Metodo

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

Per impostazione predefinita, viene restituita una vista. Qualsiasi modifica apportata influirà sull'originale.

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

Se invece hai bisogno di una copia, usa to_numpy(copy=True);

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

Nota che questa funzione funziona anche con DataFrames (mentre .arraynon lo fa).


arrayAttributo
Questo attributo restituisce unExtensionArrayoggetto che supporta l'Indice / Serie.

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

Da qui, è possibile ottenere un elenco utilizzando list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

oppure chiama direttamente .tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

Per quanto riguarda ciò che viene restituito, i documenti menzionano,

Per Seriese Indexes sostenuta da normali array NumPy, Series.array restituirà una nuova arrays.PandasArray, che è un sottile (no-copy) wrapper una numpy.ndarray. arrays.PandasArraynon è particolarmente utile di per sé, ma fornisce la stessa interfaccia di qualsiasi array di estensione definito in Panda o da una libreria di terze parti.

Quindi, per riassumere, .arraytornerà entrambi

  1. Il ExtensionArraysupporto esistente dell'Indice / Serie, o
  2. Se esiste un array NumPy che supporta la serie, un nuovo ExtensionArrayoggetto viene creato come un wrapper sottile sull'array sottostante.

Razionale per l'aggiunta di DUE nuovi metodi
Queste funzioni sono state aggiunte a seguito di discussioni in due numeri GitHub GH19954 e GH23623 .

In particolare, i documenti menzionano la logica:

[...] con .valuesesso non era chiaro se il valore restituito sarebbe l'array effettivo, una sua trasformazione o uno degli array personalizzati di panda (come Categorical). Ad esempio, con PeriodIndex, .values genera ndarrayogni volta un nuovo oggetto period. [...]

Queste due funzioni mirano a migliorare la coerenza dell'API, che rappresenta un passo importante nella giusta direzione.

Infine, .valuesnon sarà deprecato nella versione corrente, ma mi aspetto che ciò accada ad un certo punto in futuro, quindi esorto gli utenti a migrare verso l'API più recente, non appena è possibile.


48

Se hai a che fare con un dataframe multi-indice, potresti essere interessato a estrarre solo la colonna di un nome del multi-indice. Puoi farlo come

df.index.get_level_values('name_sub_index')

e ovviamente name_sub_indexdeve essere un elemento delFrozenList df.index.names


16

Da panda v0.13 puoi anche usare get_values:

df.index.get_values()

5
C'è una differenza tra questo e .values? (Ho aggiornato le informazioni sulla versione, poiché questa funzione appare dai documenti 0.13.0.)
Andy Hayden,

@Andy Hayden: Non c'è differenza che .get_values ​​è il modo ufficiale per ottenere solo i valori correnti mentre .values ​​(ad es. Su un multi-indice) può restituire valori di indice per i quali sono state eliminate le righe o le colonne?
Ezechiele Kruglick,

@EzekielKruglick quindi è sempre una copia? Il collegamento con la documentazione è molto leggero, non pensavo che avessi dei duplicati del genere (anche se sono nell'MI non saranno nei valori.) Sarebbe bello vedere un esempio che lo dimostra!
Andy Hayden,

@AndyHayden: penso che stavo leggendo il tuo commento in modo sbagliato. Hai ragione, .values ​​è buono, .level ti dà obsoleto e get_values ​​ti dà i valori correnti escludendo correttamente le righe / i punti rilasciati. Problema originale di github: github.com/pydata/pandas/issues/3686 Ma ho appena controllato e sembra che .values ​​(ovviamente!) Dia informazioni aggiornate solo in una forma diversa da quella che pensavo fosse ciò di cui stavamo parlando
Ezechiele Kruglick,

1
@AndyHayden No, non c'è differenza. get_valueschiama e basta .values. Sono più caratteri da digitare.
cs95,

0

Ho convertito i panda dataframein liste poi ho usato il basic list.index(). Qualcosa come questo:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

Hai il tuo indice come idx.


e poi ha usato il list.index di base () In che modo è collegato alla domanda di convertire una serie in un elenco?
AMC

0

Un modo più recente per farlo è utilizzare la funzione .to_numpy ().

Se ho un frame di dati con una colonna "prezzo", posso convertirlo come segue:

priceArray = df['price'].to_numpy()

È inoltre possibile passare il tipo di dati, come float o oggetto, come argomento della funzione


-1

Di seguito è riportato un modo semplice per convertire la colonna del frame di dati in matrice numpy.

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpy è una matrice numpy.

Ho provato con to.numpy()ma mi ha dato l'errore di seguito: TypeError: nessuna conversione supportata per i tipi: (dtype ('O'),) mentre eseguivo la classificazione della rilevanza binaria usando SVC lineare. to.numpy () stava convertendo dataFrame in array numpy ma il tipo di dati dell'elemento interno era elenco a causa del quale è stato osservato l'errore sopra.


Ho provato con to.numpy () ma mi ha dato l'errore di seguito: TypeError: nessuna conversione supportata per i tipi: (dtype ('O'),) mentre eseguivo la classificazione della rilevanza binaria usando SVC lineare. to.numpy () stava convertendo dataFrame in array numpy ma il tipo di dati dell'elemento interno era elenco a causa del quale è stato osservato l'errore sopra. Non è proprio colpa di questo to_numpy, però.
AMC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.