2017-08-25 6 views
0

Étant donné un panda timeseries dataframe regroupés par « UET »timeseries de GroupBy remplir les données manquantes avec 0

df 
Out[64]: 
         UUT Sum 
Date_Time      
2017-04-28 18:48:16 uut-01 2 
2017-04-28 18:48:18 uut-02 2 
2017-04-28 18:48:19 uut-03 2 

Je veux utiliser réindexation pour créer une série chronologique en 1 seconde d'intervalle, et combler les lacunes avec valeur 0 pour la colonne Somme uniquement, semblable à ce qui montre ci-dessous:

df 
Out[64]: 
         UUT Sum 
Date_Time      
2017-04-28 18:48:16 uut-01 2 
2017-04-28 18:48:16 uut-02 0 
2017-04-28 18:48:16 uut-03 0 
2017-04-28 18:48:17 uut-01 2 
2017-04-28 18:48:17 uut-02 0 
2017-04-28 18:48:17 uut-03 0 
2017-04-28 18:48:18 uut-01 0 
2017-04-28 18:48:18 uut-02 2 
2017-04-28 18:48:18 uut-03 0 
2017-04-28 18:48:19 uut-01 0 
2017-04-28 18:48:19 uut-02 0 
2017-04-28 18:48:19 uut-03 2 

je réindexation, mais ils remplirent les deux « UET » et « Somme » avec des zéros. Comment remplir l'horodatage manquant pour la colonne UUT avec des noms de uut au lieu de zéros, et remplir des zéros à la colonne 'Sum' uniquement?

idx = pd.date_range('2017-04-28 18:48:16', '2017-04-28 18:48:19', freq='1s')  
grouped = df.groupby('UUT') 
grouped.get_group('uut-01').reindex(idx, fill_value=0) 

grouped.get_group('uut-01') 

2017-04-28 18:48:16 uut-01 2 
2017-04-28 18:48:17 0   0 
2017-04-28 18:48:18 0   0 
2017-04-28 18:48:19 0   0 

Sur la base de la réponse de Kyle, je l'ai eu à travailler enfin:

df = df.set_index([df.index, 'UUT']) 
idx = pd.MultiIndex.from_product(df.index.levels, names=['Date_Time', 'UUT']) 
df = df.reindex(index=idx, fill_value=0) 
df.reset_index(level=[1]) #convert back to single index 
grouped = df.groupby('UUT') 
+0

Il est préférable de fournir les données avant de 'groupby' – Wen

+0

J'ai essayé de réindexer avant groupby, il remplit tous colonnes avec des zéros. Je pensais en faisant un groupby en premier, il traiterait chaque nom UUT comme en-tête secondaire et l'ignorerait juste – user97662

Répondre

1
df = df.set_index(['time', 'uut']) 
idx = pd.MultiIndex.from_product([df.index, df.uut]) 
df.reindex(index=idx, fill_value=0) 

        sum 
18:48:16 uut-01 2 
     uut-02 0 
     uut-03 0 
18:48:18 uut-01 0 
     uut-02 2 
     uut-03 0 
18:48:19 uut-01 0 
     uut-02 0 
     uut-03 2 
+0

J'ai dû modifier légèrement pour le faire fonctionner. – user97662