Обновление : я упростил задачу:
У меня есть следующий фрейм данных:
data = {'Portfolio': ['Book1', 'Book2', 'Book1', 'Book2'],
'Instrument': ['Water', 'Fire', 'Water', 'Water'],
'Value': [10, 5, 6, 11],
'Start': [datetime(2021, 1, 1), datetime(2021, 1, 1), datetime(2021, 1, 1), datetime(2021, 1, 1)],
'End': [datetime(2021, 12, 31), datetime(2021, 3, 31), datetime(2021, 12, 31), datetime(2021, 21, 31)]
}
df_input = pd.DataFrame(data, columns=['Portfolio', 'Instrument', 'Value', 'Start', 'End'])
![enter image description here](https://i.stack.imgur.com/C4pCt.png)
Я хотел бы создать новый фрейм данных, который будет выглядеть так:
![enter image description here](https://i.stack.imgur.com/JXzom.png)
Мне удалось создать пустой окончательный фрейм данных:
index = pd.date_range(start=df_input['Start'].min(), end=df_input['End'].max().replace(hour=23), freq='H')
col_list = [(x, y, '-') for x, y in df_input.groupby(['Portfolio', 'Instrument']).size().to_dict().keys()]
df_final = pd.DataFrame(0, index=index, columns=pd.MultiIndex.from_tuples(col_list))
Затем я могу вручную назначить каждый случай строки первого кадра данных второму, используя следующий код:
df_final.loc[(df_final.index >= datetime(2021, 1, 1)) &
(df_final.index <= datetime(2021, 3, 31).replace(hour=23),('Book2', 'Fire', '-')] += 5
Однако я не знаю, какой самый быстрый способ добавить это в al oop и использовать его для всех строк в df_input. Я пробовал искать итерации в кадре данных, но целое число rnet против этого как очень медленный метод.
Есть ли самый быстрый способ?