Indeks dostępu do ostatniego elementu w ramce danych

84

Rozglądam się za tym, ale wydaje mi się, że nie mogę go znaleźć (choć musi być niezwykle trywialne).

Problem, który mam, polega na tym, że chciałbym pobrać wartość kolumny dla pierwszego i ostatniego wpisu ramki danych. Ale jeśli to zrobię:

df.ix[0]['date']

Dostaję:

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

ale jeśli to zrobię:

df[-1:]['date']

Dostaję:

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

z innym formatem. Idealnie chciałbym mieć 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óbować:

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

ale daje to również inny format (ponieważ df.tail (1) ['IndexCopy'] nie wyświetla prostej liczby całkowitej).

Jakieś pomysły?

elelias
źródło

Odpowiedzi:

134

Poprzednia odpowiedź została teraz zastąpiona 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ótszy sposób, jaki przychodzi mi do głowy, to zastosowania .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

Jest też .first_valid_index()i .last_valid_index(), ale w zależności od tego, czy chcesz wykluczyć, NaNczy nie, mogą nie być tym, czego chcesz.

Pamiętaj, że df.ix[0]nie daje ci pierwszego, ale ten indeksowany przez 0. Na przykład w powyższym przypadku df.ix[0]dałoby

>>> df.ix[0]
Traceback (most recent call last):
  File "<ipython-input-489-494245247e87>", line 1, in <module>
    df.ix[0]
[...]
KeyError: 0
DSM
źródło
dzięki za odpowiedź. Jednak mam inną ramkę danych, w której df.ix [0] wydaje się dawać pierwszy wiersz ramki danych, mimo że pierwszy indeks nie jest równy 0. W szczególności wynik df.index [0] nie jest równy 0 , a jednak df.ix [df.index [0]] i df.ix [0] dają ten sam wynik. Dlaczego?
elelias
Musiałbym zobaczyć indeks, ale podejrzewam, że to dlatego, że indeks nie jest numeryczny, w takim przypadku dostęp za pomocą liczby całkowitej może zachowywać się jak indeks, a nie klucz. Dzieje się tak, ponieważ nie ma dwuznaczności w tym, o co prosisz, jeśli o to prosisz Something(["A", "B", "C"])[1], ale czego chcesz, jeśli masz Something([1,2,3,4])[1]? Przeczytaj różne sekcje w dokumentach na temat niektórych związanych z tym bólów głowy.
DSM,
Jak używać df ['xxx'] [df.index [0]] jako pływaka? Mam zmiennoprzecinkowy 56.7888 i jest on zamieniony na 56 zamiast 57
lvthillo
1
Wołanie iget()daje 'Series' object has no attribute 'iget'.
Suzana
15

Łączenie odpowiedzi @ comte i odpowiedzi dmdipa w funkcji Pobierz indeks wiersza ramki danych pandy jako liczby całkowitej

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

podaje wartość indeksu.


Zwróć uwagę, że indeksy nie zawsze są dobrze zdefiniowane, niezależnie od tego, czy są indeksowane wielokrotnie czy pojedynczo. Modyfikowanie ramek danych przy użyciu indeksów może spowodować nieoczekiwane zachowanie. Będziemy mieć przykład z przypadkiem z wieloma indeksami, ale należy zauważyć, że dotyczy to również przypadku z pojedynczym indeksowaniem .

Powiedz, że mamy

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              # the index is (12, 'y')
    x    3
    y    5              # the index is also (12, 'y')

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

Próba dostępu do ostatniego elementu z df[12, "y"]wynikami indeksu

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

Jeśli spróbujesz zmodyfikować ramkę danych na podstawie indeksu (12, y), zmodyfikujesz dwa wiersze zamiast jednego. Tak więc, mimo że nauczyliśmy się uzyskiwać dostęp do wartości indeksu ostatniego wiersza, może nie być dobrym pomysłem, jeśli chcesz zmienić wartości ostatniego wiersza na podstawie jego indeksu, ponieważ może istnieć wiele takich, które mają ten sam indeks. W df.iloc[-1]tym przypadku powinieneś użyć, aby uzyskać dostęp do ostatniego wiersza.

Odniesienie

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

Tai
źródło
7
df.tail(1).index 

wydaje się najbardziej czytelny

Comte
źródło
To nie zwraca liczby, ale: RangeIndex (start = 6, stop = 7, step = 1)
alexandergs
5
alex: od zwróconego index, start=6wskazuje przesunięcie ostatniego elementu. Więc df.tail(1)pobiera ostatni element, df["your_column"][6]byłby ostatnim elementem, dla your_column, itp. (Ale df.last_valid_index()podaje tylko liczbę)
michael
3

Może być już za późno, używam indexmetody, aby pobrać ostatni indeks DataFrame, a następnie używam [-1]do uzyskania ostatnich wartości:

Na przykład,

df = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
print(f'df:\n{df}\n')

print(f'Index = {df.index}\n')
print(f'Last index = {df.index[-1]}')

Wynik jest

df:
     A
0  0.0
1  0.0
2  0.0
3  0.0

Index = RangeIndex(start=0, stop=4, step=1)

Last index = 3
yoonghm
źródło
2

Chcesz .iloc z podwójnymi nawiasami.

import pandas as pd
df = pd.DataFrame({"date": range(10, 64, 8), "not_date": "fools"})
df.index += 17
df.iloc[[0,-1]][['date']]

Dajesz .iloc listę indeksów - konkretnie pierwszy i ostatni, [0, -1]. To zwraca ramkę danych, z której prosisz o kolumnę „data”. ['date'] da ci serię ( fuj ), a [['date']] da ci ramkę danych.

grofte
źródło
0

Pandas obsługuje składnię NumPy, która umożliwia:

df[len(df) -1:].index[0]
Kwant
źródło