2013-04-07 18 views
31

Rozglądam się za tym, ale nie mogę tego znaleźć (choć musi to być bardzo trywialne).Indeks dostępu ostatniego elementu w ramce danych

Problem polega na tym, że chciałbym pobrać wartość kolumny dla pierwszych i ostatnich pozycji ramki danych. Ale jeśli to zrobię:

df.ix[0]['date'] 

uzyskać:

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

ale jeśli mam zrobić:

df[-1:]['date'] 

uzyskać:

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

o innym formacie. Idealnie chciałbym móc uzyskać dostęp do wartości ostatniego indeksu ramki danych, ale nie mogę znaleźć sposobu.

Próbowałem nawet utworzyć kolumnę (IndexCopy) z wartościami indeksu i spróbuj:

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

ale daje również inny format (od df.tail (1) [ 'IndexCopy'] nie wyprowadza prostej liczby całkowitej).

Wszelkie pomysły?

Odpowiedz

40

Były odpowiedź jest teraz zastąpiony przez .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 

Najkrótsza droga mogę myśleć zastosowań .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 

Alternatywnie:

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

Dostępne są także .first_valid_index() i .last_valid_index(), ale w zależności od tego, czy chcesz wykluczyć, czy nie, możesz nie być tym, czego potrzebujesz.

Pamiętaj, że df.ix[0] nie daje pierwszy, ale jeden indeksowane przez 0. Na przykład, w powyższym przypadku, df.ix[0] przyniosłoby

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

dzięki za odpowiedź. Mam jednak inną ramkę danych, w której df.ix [0] wydaje się podawać pierwszy wiersz ramki danych, mimo że pierwszy indeks nie jest równy 0. W szczególności wynikiem jest df.index [0] nie 0, a mimo to df.ix [df.index [0]] i df.ix [0] dają taki sam wynik. Dlaczego? – elelias

+0

Musiałbym zobaczyć indeks, ale podejrzewam, że to dlatego, że indeks nie jest liczbowy, w takim przypadku dostęp do liczby całkowitej * może * zachowywać się jak indeks, a nie klucz. Dzieje się tak dlatego, że nie ma dwuznaczności w tym, o co prosisz, jeśli pytasz o coś (["A", "B", "C"]) [1] ", ale czego chcesz, jeśli masz" coś "([1,2,3,4]) [1] "? Przeczytaj różne sekcje [tutaj w dokumentach] (http://pandas.pydata.org/pandas-docs/dev/gotchas.html#integer-indexing) na temat niektórych związanych z tym bólów głowy. – DSM

3
df.tail(1).index 

wydaje się najbardziej czytelny

+0

Nie zwraca liczby, ale: RangeIndex (start = 6, stop = 7, step = 1) – alexandergs

+1

alex: z zwróconego 'indeksu',' start = 6' wskazuje przesunięcie ostatniego elementu. Tak więc 'df.tail (1)' dostaje ostatni element, 'df [" twoja_kolumna "] [6]' będzie ostatnim elementem, dla 'twojej_kolumny', itd. (Ale' df.last_valid_index() 'daje po prostu numer) – michael

4

Łącząc odpowiedź @ Comte'a i odpowiedź dmdip w Get index of a row of a pandas dataframe as an integer

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

podaje wartość indeksu.


Zauważ, że indeksami są nie zawsze dobrze zdefiniowane znaczenia, nie są indeksowane lub multi-single indeksowane. Będziemy mieć przykład z walizką z wieloma indeksami, ale zauważmy, że jest tak również w przypadku pojedynczego indeksowania.Na przykład,

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') 

Tak więc, starając się uzyskać dostęp do ostatniego elementu z indeksem df[12, "y"] daje

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

Tak więc, mimo że nauczył się dostęp do wartości indeksu ostatniego rzędu, w może nie być Dobry pomysł, jeśli chcesz zmienić wartości ostatniego wiersza na podstawie jego indeksu, ponieważ może być wiele osób, które mają ten sam indeks. Powinieneś jednak użyć df.iloc[-1], aby uzyskać dostęp do ostatniego wiersza w tym przypadku.

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

Powiązane problemy