Индекс доступа последнего элемента в фрейме данных


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 в Получить индекс строки фрейма данных 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 (start = 6, stop = 7, step = 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'] даст вам серию ( фу ), а [['date']] даст вам фрейм данных.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.