Извлечение левого и правого предела из серии интервалов панд - PullRequest
0 голосов
/ 01 января 2019

Я хочу получить интервальные поля столбца с интервалами панд и записать их в столбцы 'left', 'right'.Iterrows не работает (документация говорит, что он не будет использоваться для записи данных) и, в любом случае, это не будет лучшим решением.

import pandas as pd

i1 = pd.Interval(left=85, right=94)
i2 = pd.Interval(left=95, right=104)
i3 = pd.Interval(left=105, right=114)
i4 = pd.Interval(left=115, right=124)
i5 = pd.Interval(left=125, right=134)
i6 = pd.Interval(left=135, right=144)
i7 = pd.Interval(left=145, right=154)
i8 = pd.Interval(left=155, right=164)
i9 = pd.Interval(left=165, right=174)

data = pd.DataFrame(
    {
    "intervals":[i1,i2,i3,i4,i5,i6,i7,i8,i9],
    "left"     :[0,0,0,0,0,0,0,0,0],
    "right"    :[0,0,0,0,0,0,0,0,0]
    },
    index=[0,1,2,3,4,5,6,7,8]
)

#this is not working (has no effect):
for index, row in data.iterrows():
    print(row.intervals.left, row.intervals.right)
    row.left = row.intervals.left
    row.right = row.intervals.right

Как мы можем сделать что-то вроде:

data['left']=data['intervals'].left

data['right']=data['intervals'].right

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Для будущих читателей это должно быть немного проще в выпуске 0.24.0.

В выпуске 0.24.0 представлен IntervalArray, который является предпочтительным способом хранения интервальных данных в * 1004.* -подобные структуры.

Для первого примера @ coldspeed IntervalArray - это капля замены:

In [2]: pd.__version__
Out[2]: '0.24.0.dev0+1504.g9642fea9c'

In [3]: ia = pd.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

Если у вас уже есть интервальные данные в Series или DataFrame Второй пример @ coldspeed становится немного проще благодаря доступу к атрибуту array:

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
0 голосов
/ 01 января 2019

Создайте IntervalIndex из ваших интервалов.После этого вы можете получить доступ к атрибутам .left и .right.

idx = 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]    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

Другой вариант использует map и operator.attrgetter (смотри, ма, нет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...