Selezione di una riga di serie / frame di dati Panda per indice intero


395

Sono curioso di sapere perché df[2]non è supportato, mentre df.ix[2]ed df[2:3]entrambi funzionano.

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

Mi aspetto df[2]di funzionare allo stesso modo df[2:3]di essere coerente con la convenzione di indicizzazione di Python. Esiste un motivo di progettazione per non supportare la riga di indicizzazione per intero singolo?


4
df.ix[2]non funziona - almeno non inpandas version '0.19.2'
Zahra

9
Per vedere la differenza tra la selezione di righe e colonne tramite l'operatore di indicizzazione [], vedere questa risposta di seguito . Inoltre NON UTILIZZARE MAI .ix, è obsoleto
Ted Petrou,

Risposte:


552

facendo eco a @HYRY, vedere i nuovi documenti in 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Qui abbiamo nuovi operatori, .ilocper supportare esplicitamente solo l'indicizzazione dei numeri interi e .locper supportare esplicitamente solo l'indicizzazione delle etichette

es. immagina questo scenario

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] suddivide le righe (in base alla posizione dell'etichetta)


7
E se volessi la seconda e la terza e la quarta fila?
FaCoffee

1
puoi semplicemente passare un elenco di indicizzatori; i documenti sono indicati sopra
Jeff,

2
Qualcuno ha una giustificazione per questi nomi? Trovo questi difficili da ricordare perché non sono sicuro del perché ilocsiano le righe e le locetichette.
kilojoules,

3
@kilojoules .iloccerca le cose in base al loro ordine nell'indice (es. .iloc[[2]]) è la seconda "riga" in df. Quella riga si trova nella posizione dell'indice4 . .locli cerca dal loro valore di indice. Quindi forse "iloc" è come "i" come in A[i]? :)
Jim K.

1
@Jeff - funziona alla grande, ma cosa succede quando vuoi duplicare una riga dal tuo frame di dati, come df.loc[-1] = df.iloc[[0]], e inserirla? Il frame viene fornito con una colonna di indice aggiunta che dà errore ValueError: cannot set a row with mismatched columns (vedi stackoverflow.com/questions/47340571/… )
Growler

63

Lo scopo principale dell'operatore di indicizzazione DataFrame []è selezionare le colonne.

Quando all'operatore di indicizzazione viene passata una stringa o un numero intero, tenta di trovare una colonna con quel nome specifico e restituirla come una serie.

Quindi, nella domanda sopra: df[2]cerca un nome di colonna corrispondente al valore intero 2. Questa colonna non esiste e KeyErrorviene sollevata una.


L'operatore di indicizzazione DataFrame modifica completamente il comportamento per selezionare le righe quando viene utilizzata la notazione delle sezioni

Stranamente, quando viene data una sezione, l'operatore di indicizzazione DataFrame seleziona le righe e può farlo in base al numero intero o all'etichetta dell'indice.

df[2:3]

Questo partirà a partire dalla riga con la posizione intera da 2 a 3, escluso l'ultimo elemento. Quindi, solo una riga. Di seguito vengono selezionate le righe che iniziano nella posizione intera 6 fino a, ma non includono 20 per ogni terza riga.

df[6:20:3]

È inoltre possibile utilizzare sezioni costituite da etichette di stringa se l'indice DataFrame contiene stringhe. Per maggiori dettagli, vedi questa soluzione su .iloc vs .loc .

Non uso quasi mai questa notazione di slice con l'operatore di indicizzazione in quanto non esplicita e quasi mai utilizzata. Quando si taglia per file, attenersi a .loc/.iloc.


Tentativo di aggiungere righe a un altro frame di dati utilizzando l'operatore indxeing ma l'altro frame di dati rimane vuoto. Perché?
FindOutIslamNow,

23

Puoi pensare a DataFrame come un motto di serie. df[key]prova a selezionare l'indice di colonna per keye restituisce un oggetto Serie.

Tuttavia, sezionare all'interno di [] suddivide le righe, poiché è un'operazione molto comune.

Puoi leggere il documento per i dettagli:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


Grazie per il suggerimento. Divertente, questo genere di cose è ciò che fa ancora domande sui panda a volte. Aggiungendo eccezioni al comportamento in determinate situazioni, .. per me è come sacrificare la coerenza per un po 'di convenienza.
Carl Berger,

15

Per accedere in base all'indice alla tabella panda, si può anche considerare l' opzione numpy.as_array per convertire la tabella in matrice Numpy come

np_df = df.as_matrix()

e poi

np_df[i] 

funzionerebbe.


11
che sconfigge l'intero scopo degli indici dei frame di dati e di tutto ciò che offre Panda
Fábio Dias,

6

Puoi dare un'occhiata al codice sorgente .

DataFrameha una funzione privata _slice()per tagliare il DataFrame, e consente al parametro axisdi determinare quale asse tagliare. Il __getitem__()for DataFramenon imposta l'asse durante il richiamo _slice(). Quindi _slice()suddividilo per impostazione predefinita sull'asse 0.

Puoi fare un semplice esperimento che potrebbe aiutarti:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

5

è possibile eseguire il ciclo attraverso il frame di dati in questo modo.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
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.