2013-04-07 6 views
31

Я оглядываюсь за этим, но я не могу его найти (хотя это должно быть чрезвычайно тривиально).Индекс доступа последнего элемента в фрейме данных

Проблема в том, что я хотел бы получить значение столбца для первой и последней записей фрейма данных. Но если я делаю:

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»] не выводит простое целое число).

Любые идеи?

ответ

40

Прежний ответ теперь заменен .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(), но в зависимости от того, хотите ли вы исключить NaN, они могут быть не такими, какие вы хотите.

Помните, что 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 
+0

благодарит за ваш ответ. Однако у меня есть другой фрейм данных, в котором df.ix [0], кажется, дает первую строку кадра данных, хотя первый индекс не равен 0. В частности, результат df.index [0] равен а не 0, и все же df.ix [df.index [0]] и df.ix [0] дают тот же результат. Почему это? – elelias

+0

Мне нужно будет увидеть индекс, но я подозреваю, что это потому, что индекс не является числовым, и в этом случае доступ к целому * может * вести себя как индекс, а не ключ. Это связано с тем, что нет никакой двусмысленности в том, что вы просите, если вы попросите «Кое-что» ([«A», «B», «C»]) [1] ', но что вы хотите, если у вас есть« Что-то »([1,2,3,4]) [1] '? Прочитайте различные разделы [здесь, в документах] (http://pandas.pydata.org/pandas-docs/dev/gotchas.html#integer-indexing) о некоторых из затронутых головных болей. – DSM

3
df.tail(1).index 

кажется самым читаемым

+0

Это не возвращает число, но: RangeIndex (start = 6, stop = 7, step = 1) – alexandergs

+1

alex: из возвращенного 'index'' start = 6' указывает смещение последнего элемента. Итак, 'df.tail (1)' получает последний элемент, 'df [" your_column "] [6]' будет последним элементом для 'your_column' и т. Д. (Но' df.last_valid_index() 'дает вам просто номер) – michael

4

Объединяя ответ @ Конта и ответ dmdip в в Get index of a row of a pandas dataframe as an integer

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

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

Таким образом, пытаясь получить доступ к последнему элементу с индексом df[12, "y"] дает

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

Таким образом, даже если мы научились обращаться к значению индекса последней строки, в она не может быть хорошая идея, если вы хотите изменить значения последней строки на основе своего индекса, так как может быть много тех, которые имеют один и тот же индекс. Вы должны использовать df.iloc[-1] для доступа к последней строке в этом случае.

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

Смежные вопросы