Подтвердить что ты не робот

Как выполнить итерацию по 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 в день и отправить его для обработки.

4b9b3361

Ответ 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])