98

我一直在寻找这个,但我似乎找不到它(尽管它必须非常微不足道)。

我遇到的问题是我想为数据框的第一个和最后一个条目检索列的值。但如果我这样做:

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'] 不输出简单的整数)。

有任何想法吗?

4

6 回答 6

159

以前的答案现在被取代.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()and .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
于 2013-04-07T13:40:31.360 回答
23

将 @comte 的答案和 dmdip 的答案结合在Get index of a pandas dataframe of a row 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              # 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

如果您尝试根据 index 修改数据框(12, y),您将修改两行而不是一行。因此,即使我们学会了访问最后一行索引的值,如果您想根据其索引更改最后一行的值,这可能不是一个好主意,因为可能有许多共享相同的索引。不过,在这种情况下,您应该使用df.iloc[-1]访问最后一行。

参考

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

于 2018-01-03T22:05:42.850 回答
8
df.tail(1).index 

似乎最易读

于 2016-05-12T08:39:42.983 回答
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
于 2018-09-20T10:16:44.207 回答
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']] 会给你一个数据框。

于 2020-03-13T13:59:59.277 回答
1

Pandas 支持 NumPy 语法,它允许:

df[len(df) -1:].index[0]
于 2020-09-19T13:28:33.950 回答