Индекс доступа последнего элемента в кадре данных
Я оглядываюсь за этим, но я не могу найти его (хотя это должно быть чрезвычайно тривиально).
Проблема, которая у меня есть, заключается в том, что я хотел бы получить значение столбца для первой и последней записей фрейма данных. Но если я это сделаю:
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'] не выводит простое целое число).
Любые идеи?
Ответы
Ответ 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]]]