Sai come ottenere l'indice o la colonna di un DataFrame come un array NumPy o un elenco Python?
Sai come ottenere l'indice o la colonna di un DataFrame come un array NumPy o un elenco Python?
Risposte:
Per ottenere un array NumPy, è necessario utilizzare l' values
attributo:
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.
.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 ?
È possibile utilizzare df.index
per 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.
df.index.values.tolist()
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.
.values
a favore di questi metodi!Da v0.24.0 in poi, avremo due nuovi metodi preferiti zecca per ottenere matrici NumPy da Index
, Series
e DataFrame
oggetti: sono to_numpy()
, e .array
. Per quanto riguarda l'utilizzo, i documenti menzionano:
Non abbiamo rimosso o deprecato
Series.values
oDataFrame.values
, ma consigliamo vivamente e utilizzare.array
o.to_numpy()
invece.
Vedere questa sezione delle note sulla versione v0.24.0 per ulteriori informazioni.
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 .array
non lo fa).
array
Attributo
Questo attributo restituisce unExtensionArray
oggetto 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
Series
eIndex
es sostenuta da normali array NumPy,Series.array
restituirà una nuovaarrays.PandasArray
, che è un sottile (no-copy) wrapper unanumpy.ndarray
.arrays.PandasArray
non è 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, .array
tornerà entrambi
ExtensionArray
supporto esistente dell'Indice / Serie, oExtensionArray
oggetto 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
.values
esso non era chiaro se il valore restituito sarebbe l'array effettivo, una sua trasformazione o uno degli array personalizzati di panda (comeCategorical
). Ad esempio, conPeriodIndex
,.values
generandarray
ogni volta un nuovo oggetto period. [...]
Queste due funzioni mirano a migliorare la coerenza dell'API, che rappresenta un passo importante nella giusta direzione.
Infine, .values
non 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.
Da panda v0.13 puoi anche usare get_values
:
df.index.get_values()
get_values
chiama e basta .values
. Sono più caratteri da digitare.
Ho convertito i panda dataframe
in list
e 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
.
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.
to_numpy
, però.