访问数据框中最后一个元素的索引

时间:2013-04-07 11:51:50

标签: python pandas

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

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

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

有什么想法吗?

7 个答案:

答案 0 :(得分:71)

以前的答案现在被.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 s,它们可能不是您想要的。

请记住,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

答案 1 :(得分:11)

Get index of a row of a pandas dataframe as an integer

中结合@ comte的答案和dmdip的答案
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

答案 2 :(得分:4)

df.tail(1).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']将为您提供一系列( yuck ),[['date']]将为您提供一个数据框。

答案 4 :(得分:0)

现在可能为时已晚,我使用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 :(得分:0)

Pandas支持NumPy语法,该语法允许:

df[len(df) -1:].index[0]

答案 6 :(得分:-1)

打印数据框的索引范围,然后使用方括号和.loc调用最后一个索引:


import pandas as pd

#使用熊猫read_csv读取示例数据集

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

#使用pandas函数'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]]]