Как выполнить итерацию по pandas мультииндексу данных с использованием индекса
У меня есть фрейм данных df, который выглядит так. Дата и время - это 2 многоуровневых индекса
observation1 observation2
date Time
2012-11-02 9:15:00 79.373668 224
9:16:00 130.841316 477
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.76646 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.77333 621
2012-11-04 9:15:00 115.449437 122
9:16:00 123.776946 555
9:17:00 153.76646 344
9:18:00 463.276946 212
Я хочу сделать сложный процесс над ежедневным блоком данных.
Код Psuedo будет выглядеть как
for count in df(level 0 index) :
new_df = get only chunk for count
complex_process(new_df)
Итак, прежде всего, я не мог найти способ доступа только к блокам для даты
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.76646 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.77333 621
а затем отправить его для обработки. Я делаю это в цикле for, так как не уверен, есть ли способ сделать это, не упоминая точное значение столбца уровня 0. Я сделал базовый поиск и смог получить df.index.get_level_values (0), но он возвращает мне все значения и вызывает цикл, который запускается несколько раз в течение дня. Я хочу создать DataFrame в день и отправить его для обработки.
Ответы
Ответ 1
Один простой способ - группировать по первому уровню индекса - итерация по объекту groupby возвращает ключи группы и подкадр, содержащий каждую группу.
In [136]: for date, new_df in df.groupby(level=0):
...: print(new_df)
...:
observation1 observation2
date Time
2012-11-02 9:15:00 79.373668 224
9:16:00 130.841316 477
observation1 observation2
date Time
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.766460 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.773330 621
observation1 observation2
date Time
2012-11-04 9:15:00 115.449437 122
9:16:00 123.776946 555
9:17:00 153.766460 344
9:18:00 463.276946 212
Ответ 2
Как насчет этого?
for idate in df.index.get_level_values('date'):
complex_process(df.ix[idate], idate)
Ответ 3
Отмечая ответ @psorenson, мы можем получить уникальные индексы уровня и связанные с ним срезы кадра данных без numpy следующим образом:
for date in df.index.get_level_values('date').unique():
print(df.loc[date])