web-dev-qa-db-fra.com

Comment itérer sur une base de données multi-index pandas en utilisant index

J'ai un cadre de données df qui ressemble à ceci. Date et heure sont 2 index multiniveau

                           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

Je veux avoir un processus complexe sur bloc de données quotidien.

Le code Psuedo ressemblerait à

 for count in df(level 0 index) :
     new_df = get only chunk for count
     complex_process(new_df)

Donc, tout d’abord, je n’ai pas pu trouver un moyen d’accéder uniquement à des blocs pour une date.

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

et ensuite l'envoyer pour traitement. Je le fais dans la boucle car je ne suis pas sûr s'il y a un moyen de le faire sans mentionner la valeur exacte de la colonne de niveau 0. J'ai fait une recherche de base et j'ai pu obtenir df.index.get_level_values ​​(0), mais cela me renvoie toutes les valeurs et cela entraîne l'exécution de la boucle plusieurs fois par jour. Je souhaite créer un cadre de données par jour et l'envoyer pour traitement.

35
Yantraguru

Un moyen simple serait de grouper par le premier niveau de l'index - une itération sur l'objet groupby renverra les clés de groupe et une sous-trame contenant chaque groupe.

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
56
chrisb

Et ça?

for idate in df.index.get_level_values('date'):
    complex_process(df.ix[idate], idate)
5
psorenson

En repérant @psorenson, nous pouvons obtenir des index de niveau uniques et les tranches de trames de données associées sans numpy, comme suit: 

for date in df.index.get_level_values('date').unique():
    print(df.loc[date])
1
melbay