Sheldon
Sheldon

Reputation: 4653

How to access the last element in a Pandas series

Let us consider the following data frame:

import pandas as pd

d = {'col1': [1, 2, 3], 'col2': [3, 4, 5]}
df=pd.DataFrame(data=d)

If I want to access the first element in pandas series df['col1'], I can simply go df['col1'][0].

But how can I access the last element in this series? I have tried df['col1'][-1] which returns the following error:

KeyError: -1L

I know that I could go for something like df['col1'][len(df)-1] but why is reverse indexing impossible here?

Upvotes: 72

Views: 101122

Answers (5)

Senkron
Senkron

Reputation: 11

You can also use:

df.iloc[-1, 0]

Upvotes: 1

not_a_coder
not_a_coder

Reputation: 191

To take last through values is the most quick way:

%timeit df['code'].values[-1].   )

5.58 µs ± 985 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit df.loc[df.index[-1], 'code']

12 µs ± 2.71 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit df['code'].iat[-1]

5.71 µs ± 896 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit df['code'].tail(1).item()

36 µs ± 3.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit df.iloc[-1, df.columns.get_loc('code')]

33.7 µs ± 5.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit df['code'].iloc[-1]

8.08 µs ± 496 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Upvotes: 19

rachwa
rachwa

Reputation: 2310

Alternatively you can use take:

In [6]: df['col1'].take([-1]).item()
Out[6]: 3

Upvotes: 1

U13-Forward
U13-Forward

Reputation: 71610

You can also use tail:

print(df['col1'].tail(1).item())

Output:

3

Upvotes: 11

jezrael
jezrael

Reputation: 863531

For select last value need Series.iloc or Series.iat, because df['col1'] return Series:

print (df['col1'].iloc[-1])
3
print (df['col1'].iat[-1])
3

Or convert Series to numpy array and select last:

print (df['col1'].values[-1])
3

Or use DataFrame.iloc or DataFrame.iat - but is necessary position of column by Index.get_loc:

print (df.iloc[-1, df.columns.get_loc('col1')])
3
print (df.iat[-1, df.columns.get_loc('col1')])
3

Or is possible use last value of index (necessary not duplicated) and select by DataFrame.loc:

print (df.loc[df.index[-1], 'col1'])
3

Upvotes: 98

Related Questions