Індекс доступу останнього елемента у фреймі даних


84

Я шукаю це навколо, але, здається, не можу знайти (хоча це повинно бути надзвичайно тривіально).

У мене проблема полягає в тому, що я хотів би отримати значення стовпця для першого та останнього записів кадру даних. Але якщо я:

df.ix[0]['date']

Я отримав:

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

але якщо я це роблю:

df[-1:]['date']

Я отримав:

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

з іншим форматом. В ідеалі, я хотів би мати доступ до значення останнього індексу кадру даних, але я не можу знайти, як.

Я навіть намагався створити стовпець (IndexCopy) зі значеннями індексу і спробувати:

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

але це також дає інший формат (оскільки df.tail (1) ['IndexCopy'] не виводить просте ціле число).

Будь-які ідеї?

Відповіді:


134

Колишня відповідь тепер замінена .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

Найкоротший спосіб, про який я можу подумати, використовує .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

Або:

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

Є також .first_valid_index()і .last_valid_index(), але залежно від того, чи хочете ви виключити NaNs, вони можуть бути не тим, що ви хочете.

Пам'ятайте , що df.ix[0]не дає вам перший, але один проіндексовані 0. Наприклад, у наведеному вище випадку, df.ix[0]буде виробляти

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

Дякую за вашу відповідь. Однак у мене є інший кадр даних, в якому df.ix [0], здається, дає перший рядок кадру даних, навіть якщо перший індекс не дорівнює 0. Зокрема, результат df.index [0] не дорівнює 0 , і все ж df.ix [df.index [0]] і df.ix [0] дають однакові результати. Чому так?
elelias

Мені потрібно було б побачити індекс, але я підозрюю, що це тому, що індекс нечисловий, і в цьому випадку доступ за цілим числом може поводитися так, ніби це індекс, а не ключ. Це тому, що немає жодної двозначності у тому, про що ви просите, якщо просите Something(["A", "B", "C"])[1], але що ви хочете, якщо маєте Something([1,2,3,4])[1]? Прочитайте різні розділи тут, у документації, щодо деяких головних болів.
DSM

Як використовувати df ['xxx'] [df.index [0]] для поплавця? У мене є поплавок 56,7888, і він перетворений на 56 замість 57
lvthillo

1
Телефонування iget()дає 'Series' object has no attribute 'iget'.
Сузана

15

Поєднання відповіді @ comte та відповіді dmdip у Get index рядка кадру даних pandas як цілого числа

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

дає вам значення індексу.


Зверніть увагу, що індекси не завжди є чітко визначеними, неважливо, вони мультиіндексовані або одноіндексовані. Зміна кадрів даних за допомогою індексів може призвести до несподіваної поведінки. Ми матимемо приклад із багатоіндексною справою, але зауважимо, що це також справедливо для одноіндексованої справи .

Скажімо, що маємо

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

Спроба отримати доступ до останнього елемента з індексом df[12, "y"]приносить

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

Якщо ви спробуєте змінити фрейм даних на основі індексу (12, y), ви зміните два рядки, а не один. Таким чином, навіть незважаючи на те, що ми навчились отримувати доступ до значення індексу останнього рядка, можливо , це не буде гарною ідеєю, якщо ви хочете змінити значення останнього рядка на основі його індексу, оскільки їх може бути багато, що мають однаковий індекс. У df.iloc[-1]цьому випадку вам слід скористатися для доступу до останнього рядка.

Довідково

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


7
df.tail(1).index 

здається найбільш читабельним


Це не повертає число, але: RangeIndex (старт = 6, стоп = 7, крок = 1)
alexandergs

5
Алекс: від повертається index, то start=6вказує на зсув останнього елемента. Отже, df.tail(1)отримує останній елемент, df["your_column"][6]це буде останній елемент, для your_columnтощо (але df.last_valid_index()дає вам лише число)
Майкл

3

Зараз може бути пізно, я використовую indexметод для отримання останнього індексу DataFrame, а потім використовую[-1] для отримання останніх значень:

Наприклад,

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

Вихідний результат

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

2

Ви хочете .iloc з подвійними дужками.

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

Ви надаєте .iloc список індексів - зокрема перший і останній, [0, -1]. Це повертає фрейм даних, з якого ви запитуєте стовпець "дата". ['date'] дасть вам серію ( yuck ), а [['date']] - кадр даних.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.