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


83

我一直在寻找这个,但是我似乎找不到它(尽管它必须是非常琐碎的)。

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

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

有任何想法吗?

Answers:


129

以前的答案现在已被取代.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]似乎也给出了数据帧的第一行。特别是df.index [0]的结果不为0 ,而df.ix [df.index [0]]和df.ix [0]确实给出了相同的结果。这是为什么?
elelias 2013年

我需要看的指标,但我怀疑这是因为索引非数字,在这种情况下,通过整数访问可以表现得像是一个指标,而不是一个关键。这是因为如果Something(["A", "B", "C"])[1]您要的话,您所要的内容并没有歧义,但是如果您要的话,您想要什么Something([1,2,3,4])[1]呢?阅读文档中的各个部分,其中涉及一些令人头疼的问题。
DSM 2013年

如何使用df ['xxx'] [df.index [0]]进行浮点运算?我有一个浮动56.7888,它转换为56而不是57
lvthillo

1
打电话iget()'Series' object has no attribute 'iget'
Suzana

15

获取熊猫数据帧行索引的整数中将@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


7
df.tail(1).index 

似乎最易读


这不会返回数字,但是:RangeIndex(start = 6,stop = 7,step = 1)
alexandergs

5
alex:从返回的indexstart=6指示最后一个元素的偏移量。因此,df.tail(1)获取最后一个元素,df["your_column"][6]将是最后一个元素,例如your_column,等等(但只df.last_valid_index()给您数字)
michael

2

现在可能为时已晚,我使用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

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']]将给您一个数据框。


0

熊猫支持NumPy语法,该语法允许:

df[len(df) -1:].index[0]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.