Как сложить значения столбца, когда диапазоны перекрываются в Python - PullRequest
0 голосов
/ 23 мая 2018

У меня есть эта таблица:

    id   start  end  stg
0   ZZ   0      25   5.0
1   ZZ   10     65   7.0
2   ZZ   30     50   2.0
3   ZZ   50     60   3.0
4   BB   0      2    5.6
5   BB   5      8    6.6
6   BB   8      13   18.0

Я хочу добавить значения в «stg», если есть перекрытия в диапазонах [start, end] и создать новые диапазоны и stg.Вывод должен выглядеть примерно так:

    id   start  end  stg
0   ZZ   0      10   5
1   ZZ   10     25   12
2   ZZ   25     30   7
3   ZZ   30     50   9
4   ZZ   50     60   10
5   ZZ   60     65   7
6   BB   0      5    5.6
7   BB   5      8    6.6
8   BB   8      13   18.0

1 Ответ

0 голосов
/ 23 мая 2018

Это только частичное решение, поскольку оно полностью игнорирует id.Использование IntervalIndex:

Пример данных

df = pd.DataFrame({'id': ['ZZ'] * 4, 
                   'start': [0, 10, 30, 50], 
                   'end': [25, 65, 50, 60], 
                   'stg': [5.0, 7.0, 2.0, 3.0]})
df = df[['id', 'start', 'end', 'stg']]

df
   id  start  end  stg
0  ZZ      0   25  5.0
1  ZZ     10   65  7.0
2  ZZ     30   50  2.0
3  ZZ     50   60  3.0

Получить наименьшие подинтервалы, определенные начальными и конечными значениями

subints = pd.IntervalIndex.from_breaks(sorted(np.unique(df[['start', 'end']].values.flatten())))
subints
IntervalIndex([(0, 10], (10, 25], (25, 30], (30, 50], (50, 60], (60, 65]]
              closed='right',
              dtype='interval[int64]')

Установить IntervalIndex для исходного DF

idx = pd.IntervalIndex.from_arrays(df['start'], df['end'])
df.set_index(idx, inplace=True)
df
          id  start  end  stg
(0, 25]   ZZ      0   25  5.0
(10, 65]  ZZ     10   65  7.0
(30, 50]  ZZ     30   50  2.0
(50, 60]  ZZ     50   60  3.0

Использование нарезки IntervalIndex в понимании списка

result = pd.DataFrame([(s.left, s.right, df2.loc[s]['stg'].sum()) 
                       for s in subints], 
                      columns=['start', 'end', 'stg'])
result
   start  end   stg
0      0   10   5.0
1     10   25  12.0
2     25   30   7.0
3     30   50   9.0
4     50   60  10.0
5     60   65   7.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...