2017-06-28 1 views
1

J'ai un dataframe avec period_start_time toutes les 15 minutes et maintenant je dois agréger à 1 heure et calculer la somme et avg pour presque chaque colonne en dataframe (il a environ 20 colonnes) etAgréger à 15 minutes en fonction de l'heure et trouver la somme, avg et max pour plusieurs colonnes dans les pandas

PERIOD_START_TIME  ID  val1  val2 
    06.21.2017 22:15:00  12  3  0 
    06.21.2017 22:30:00  12  5  6 
    06.21.2017 22:45:00  12  0  3 
    06.21.2017 23:00:00  12  5  2 
    ... 
    06.21.2017 22:15:00  15  9  2 
    06.21.2017 22:30:00  15  0  2 
    06.21.2017 22:45:00  15  1  5 
    06.21.2017 23:00:00  15  0  1 
    ... 

    Desired output: 
    PERIOD_START_TIME  ID val1(avg) val1(sum) val1(max) ... 
    06.21.2017 22:00:00  12  3.25  13   5  
    ... 
    06.21.2017 23:00:00  15  2.25  10   9 ... 

et pour les colonnes val2 aussi, et pour toutes les autres colonnes de dataframe. Je n'ai aucune idée de comment grouper par heure de début de période pour chaque heure, pas pour toute la journée, aucune idée de comment commencer.

Répondre

4

Je crois que vous avez besoin pour Series.dt.floorHour s puis agrégées par agg:

df = df.groupby([df['PERIOD_START_TIME'].dt.floor('H'),'ID']).agg(['mean','sum', 'max']) 
#for columns from MultiIndex 
df.columns = df.columns.map('_'.join) 
print (df) 
         val1_mean val1_sum val1_max val2_mean val2_sum \ 
PERIOD_START_TIME ID              
2017-06-21 22:00:00 12 2.666667   8   5   3   9 
        15 3.333333  10   9   3   9 
2017-06-21 23:00:00 12 5.000000   5   5   2   2 
        15 0.000000   0   0   1   1 

         val2_max 
PERIOD_START_TIME ID    
2017-06-21 22:00:00 12   6 
        15   5 
2017-06-21 23:00:00 12   2 
        15   1 

df = df.reset_index() 
print (df) 
    PERIOD_START_TIME ID val1_mean val1_sum val1_max val2_mean val2_sum \ 
0 2017-06-21 22:00 12 2.666667   8   5   3   9 
1 2017-06-21 22:00 15 3.333333  10   9   3   9 
2 2017-06-21 23:00 12 5.000000   5   5   2   2 
3 2017-06-21 23:00 15 0.000000   0   0   1   1 

    val2_max 
0   6 
1   5 
2   2 
3   1 
+0

KeyError: « PERIOD_START_TIME » c'est ce que je suis si je mets PERIOD_START_TIME comme un indice. – jovicbg

+0

Je pense utiliser une version plus ancienne des pandas, donc besoin de 'df = df.reset_index(). Groupby (['PERIOD_START_TIME', 'ID']). Agg (['signifie', 'somme'])' – jezrael

+0

J'utilise [ ceci] (http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#groupby-enhancements) amélioration. – jezrael

1

Très De même, vous pouvez convertir PERIOD_START_TIME à une période de pandas géants.

df['PERIOD_START_TIME'] = df['PERIOD_START_TIME'].dt.to_period('H') 
df.groupby(['PERIOD_START_TIME', 'ID']).agg(['max', 'min', 'mean']).reset_index()