2013-04-07 7 views
31

Ho cercato questo, ma non riesco a trovarlo (anche se deve essere estremamente banale).Indice di accesso dell'ultimo elemento nel frame di dati

Il problema che ho è che vorrei recuperare il valore di una colonna per la prima e l'ultima voce di un frame di dati. Ma se faccio:

df.ix[0]['date'] 

ottengo:

datetime.datetime(2011, 1, 10, 16, 0) 

ma se lo faccio:

df[-1:]['date'] 

ottengo:

myIndex 
13   2011-12-20 16:00:00 
Name: mydate 

con un formato diverso. Idealmente, mi piacerebbe poter accedere al valore dell'ultimo indice del frame di dati, ma non riesco a trovare come.

Ho anche cercato di creare una colonna (IndexCopy) con i valori dell'indice e prova:

df.ix[df.tail(1)['IndexCopy']]['mydate'] 

ma produce anche un formato diverso (dal df.tail (1) [ 'IndexCopy'] non emette un numero intero semplice).

Qualche idea?

risposta

40

L'ex risposta è ora sostituito da .iloc:

>>> df = pd.DataFrame({"date": range(10, 64, 8)}) 
>>> df.index += 17 
>>> df 
    date 
17 10 
18 18 
19 26 
20 34 
21 42 
22 50 
23 58 
>>> df["date"].iloc[0] 
10 
>>> df["date"].iloc[-1] 
58 

La via più breve che posso pensare di usi .iget():

>>> df = pd.DataFrame({"date": range(10, 64, 8)}) 
>>> df.index += 17 
>>> df 
    date 
17 10 
18 18 
19 26 
20 34 
21 42 
22 50 
23 58 
>>> df['date'].iget(0) 
10 
>>> df['date'].iget(-1) 
58 

alternativa:

>>> df['date'][df.index[0]] 
10 
>>> df['date'][df.index[-1]] 
58 

C'è anche .first_valid_index() e .last_valid_index(), ma a seconda che tu voglia o meno escludere NaN s potrebbero non essere quello che vuoi.

Ricorda che df.ix[0] non ti dà il primo, ma quello indicizzato da 0. Ad esempio, nel caso di cui sopra, df.ix[0] produrrebbe

>>> df.ix[0] 
Traceback (most recent call last): 
    File "<ipython-input-489-494245247e87>", line 1, in <module> 
    df.ix[0] 
[...] 
KeyError: 0 
+0

grazie per la risposta. Tuttavia, ho un altro frame di dati in cui df.ix [0] sembra dare la prima riga del frame di dati, anche se il primo indice non è 0. In particolare, il risultato di df.index [0] è non 0, eppure df.ix [df.index [0]] e df.ix [0] danno lo stesso risultato. Perché? – elelias

+0

Avrei bisogno di vedere l'indice, ma ho il sospetto che sia perché l'indice non è numerico, nel qual caso l'accesso per intero * può * comportarsi come se fosse un indice, e non una chiave. Questo perché non c'è ambiguità in quello che chiedi se chiedi 'Something ([" A "," B "," C "]) [1]', ma cosa vuoi se hai qualcosa? [1,2,3,4]) [1] '? Leggi le varie sezioni [qui nella documentazione] (http://pandas.pydata.org/pandas-docs/dev/gotchas.html#integer-indexing) su alcuni dei mal di testa coinvolti. – DSM

3
df.tail(1).index 

sembra il più leggibile

+0

Questo non restituisce un numero ma: RangeIndex (start = 6, stop = 7, step = 1) – alexandergs

+1

alex: dall'indice restituito, 'start = 6' indica l'offset dell'ultimo elemento. Quindi, 'df.tail (1)' ottiene l'ultimo elemento, 'df [" your_column "] [6]' sarebbe l'ultimo elemento, per 'your_column', ecc (ma' df.last_valid_index() 'ti dà solo il numero) – michael

4

La combinazione di risposta @ di Comte e la risposta di dmdip in Get index of a row of a pandas dataframe as an integer

df.tail(1).index.item() 

fornisce il valore dell'indice.


noti che indici sono non sempre ben definiti non importa che sono multi-indicizzati o indicizzati singolo. Avremo un esempio con un caso a più indici, ma si noti che questo è vero anche in un caso a indicizzazione singola.Ad esempio,

df = pd.DataFrame({'x':[1,1,3,3],'y':[3,3,5,5]},index=[11,11,12,12]).stack() 

11 x 1 
    y 3 
    x 1 
    y 3 
12 x 3 
    y 5    # index is (12, 'y') 
    x 3 
    y 5    # index is also (12, 'y') 

df.tail(1).index.item() # gives (12, 'y') 

Così, nel tentativo di accedere l'ultimo elemento con l'indice df[12, "y"]

(12, y) 5 
(12, y) 5 
dtype: int64 

Così, anche se abbiamo imparato per accedere al valore dell'indice di ultima fila, potrebbe non essere una buona idea se vuoi cambiare i valori dell'ultima riga in base al suo indice in quanto potrebbero esserci molti che condividono lo stesso indice. Tuttavia, dovresti usare df.iloc[-1] per accedere all'ultima riga in questo caso.

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.item.html

Problemi correlati