Подтвердить что ты не робот

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

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

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

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

Любые идеи?

4b9b3361

Ответ 1

Первый ответ теперь заменяется на .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

Ответ 2

Объединение @comte answer и dmdip answer в Получите индекс строки кадра данных 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

Ответ 3

df.tail(1).index 

кажется наиболее читаемым

Ответ 4

Сейчас может быть слишком поздно, я использую метод 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

Ответ 5

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


import pandas as pd

# Чтение в примере набора данных с пандами read_csv

df = pd.read_csv( 'https://raw.githubusercontent.com/plotly/datasets/master/1962_2006_walmart_store_openings.csv' )

# Запись диапазона индексов фрейма данных с помощью функции панд 'index'

index = df.index

print(index)

>>> RangeIndex (start = 0, stop = 2992, step = 1)

'' 'Передайте результат ("stop" - 1), потому что последний индекс в вашем фрейме данных обычно зарезервирован для информации данных' ''

df.loc[0, 2991]

>>> (напечатает вашу таблицу данных с первым и последним индексом)


Или для более простой, но менее явной альтернативы, вы можете просто сделать:

df = pd.read_csv( 'https://raw.githubusercontent.com/plotly/datasets/master/1962_2006_walmart_store_openings.csv' )

df.loc[[0, df.index[-1]]]