Skip to content Skip to sidebar Skip to footer

Extract Left And Right Limit From A Series Of Pandas Intervals

I want to get interval margins of a column with pandas intervals and write them in columns 'left', 'right'. Iterrows does not work (documentation says it would not be use for writi

Solution 1:

Create an pandas.IntervalIndex from your intervals. You can then access the .left and .right attributes.

import pandas as pdidx= pd.IntervalIndex([i1, i2, i3, i4, i5, i6, i7, i8, i9])  
pd.DataFrame({'intervals': idx, 'left': idx.left, 'right': idx.right})

    intervals  left  right
0    (85, 94]    85941   (95, 104]    951042  (105, 114]   1051143  (115, 124]   1151244  (125, 134]   1251345  (135, 144]   1351446  (145, 154]   1451547  (155, 164]   1551648  (165, 174]   165174

Another option is using map and operator.attrgetter (look ma, no lambda...):

from operator import attrgetter

df['left'] = df['intervals'].map(attrgetter('left'))
df['right'] = df['intervals'].map(attrgetter('right'))

df
    intervals left right
0    (85, 94]   85    94
1   (95, 104]   95   104
2  (105, 114]  105   114
3  (115, 124]  115   124
4  (125, 134]  125   134
5  (135, 144]  135   144
6  (145, 154]  145   154
7  (155, 164]  155   164
8  (165, 174]  165   174

Solution 2:

A pandas.arrays.IntervalArray, is the preferred way for storing interval data in Series-like structures.

For @coldspeed's first example, IntervalArray is basically a drop in replacement:

In [2]: pd.__version__
Out[2]: '1.1.3'

In [3]: ia = pd.arrays.IntervalArray([i1, i2, i3, i4, i5, i6, i7, i8, i9])

In [4]: df = pd.DataFrame({'intervals': ia, 'left': ia.left, 'right': ia.right})

In [5]: df
Out[5]:
    intervals  left  right
0    (85, 94]    85     94
1   (95, 104]    95    104
2  (105, 114]   105    114
3  (115, 124]   115    124
4  (125, 134]   125    134
5  (135, 144]   135    144
6  (145, 154]   145    154
7  (155, 164]   155    164
8  (165, 174]   165    174

If you already have interval data in a Series or DataFrame, @coldspeed's second example becomes a bit more simple by accessing the array attribute:

In [6]: df = pd.DataFrame({'intervals': ia})

In [7]: df['left'] = df['intervals'].array.left

In [8]: df['right'] = df['intervals'].array.right

In [9]: df
Out[9]:
    intervals  left  right
0    (85, 94]    85     94
1   (95, 104]    95    104
2  (105, 114]   105    114
3  (115, 124]   115    124
4  (125, 134]   125    134
5  (135, 144]   135    144
6  (145, 154]   145    154
7  (155, 164]   155    164
8  (165, 174]   165    174

Solution 3:

A simple way is to use apply() method:

    data['left'] = data['intervals'].apply(lambda x: x.left)
    data['right'] = data['intervals'].apply(lambda x: x.right)
    data
    intervals      leftright0   (85, 94]     85941   (95, 104]    95104
    ...
    8   (165, 174]  165174

Post a Comment for "Extract Left And Right Limit From A Series Of Pandas Intervals"