Это только частичное решение, поскольку оно полностью игнорирует 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