User Tools

Site Tools


get_first_element_of_series_if_not_empty

This is an old revision of the document!


get first element of series if not empty

tags | apply iloc[0] on a series only if it is not empty, pandas check for emptiness before applying iloc, check for emptiness before getting the first element

Task

dataframe → filter rows → take one column → get the first value

Issue

We can't use something like

df.loc[mask]['C'].iloc[0]

since iloc[0] will throw the exception

IndexError: single positional indexer is out-of-bounds

if df.loc[mask] is empty.

For example

% ipython
Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.18.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: 
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8) + 1.5, 'D': np.arange(8) * 2})
print(df)

     A      B    C   D
0  foo    one  1.5   0
1  bar    one  2.5   2
2  foo    two  3.5   4
3  bar  three  4.5   6
4  foo    two  5.5   8
5  bar    two  6.5  10
6  foo    one  7.5  12
7  foo  three  8.5  14
In [2]:
mask = (df['A'] == 'foo') & (df['B'] == 'four')
df.loc[mask]['C'].iloc[0]

...
IndexError: single positional indexer is out-of-bounds

Solution

Use

next(iter(df.loc[mask]['C']), None)

With the above example

In [3]: 
next(iter(df.loc[mask]['C']), None)

In [4]: 
next(iter(df.loc[mask]['C']), None) is None
Out[4]: 
True

when df.loc[mask] is not empty, it works as expected.

In [5]: 
mask2 = (df['A'] == 'foo') & (df['B'] == 'two')
df.loc[mask2]['C']
Out[5]: 
2    3.5
4    5.5
Name: C, dtype: float64

In [6]: 
next(iter(df.loc[mask2]['C']), None)
Out[6]: 
3.5

In [7]: 
type(next(iter(df.loc[mask2]['C']), None))
Out[7]: 
float
get_first_element_of_series_if_not_empty.1610782354.txt.gz · Last modified: 2021/01/16 07:32 by raju