2015-11-03 41 views
6

Ho un DataFrame panda con 2 indici. (MultiIndex) Voglio estrarre una Numpy Matrix con qualcosa come df.as_matrix(...) ma questa matrice ha la forma (n_rows, 1). Voglio una matrice di forma (n_index1_rows, n_index2_rows, 1).Pandas DataFrame con MultiIndex a Numpy Matrix

C'è un modo per utilizzare .groupby(...) quindi un .values.tolist() o .as_matrix(...) per ottenere la forma desiderata?

EDIT: Dati

               value 
current_date     temp_date           
1970-01-01 00:00:01.446237485 1970-01-01 00:00:01.446237489 30.497100 
           1970-01-01 00:00:01.446237494 9.584300 
           1970-01-01 00:00:01.446237455 10.134200 
           1970-01-01 00:00:01.446237494 7.803683 
           1970-01-01 00:00:01.446237400 10.678700 
           1970-01-01 00:00:01.446237373 9.700000 
           1970-01-01 00:00:01.446237180 15.000000 
           1970-01-01 00:00:01.446236961 12.928866 
           1970-01-01 00:00:01.446237032 10.458800 

Questa è una specie di idea:

np.array([np.resize(x.as_matrix(["value"]).copy(), (500, 1)) for (i, x) in df.reset_index("current_date").groupby("current_date")]) 
+0

Si desidera un array 3D? O solo un array 2D che include l'indice e la colonna? –

+0

array 3D. Tutti i valori in np.array devono essere valori di colonna (non indici) –

+0

Potresti fornire alcuni dati di esempio con l'output desiderato? – Alexander

risposta

5

Penso che ciò che si desidera è di unstack il multiindex, per esempio

df.unstack().values[:, :, np.newaxis] 

Edit: se si dispone di indici duplicati, unstacking non funziona, e probabilmente si desidera un pivot_table invece:

pivoted = df.reset_index().pivot_table(index='current_date', 
             columns='temp_date', 
             aggfunc='mean') 
arr = pivoted.values[:, :, np.newaxis] 
arr.shape 
# (10, 50, 1) 

Ecco un esempio completo di unstack. Per prima cosa creiamo alcuni dati:

current = pd.date_range('2015', periods=10, freq='D') 
temp = pd.date_range('2015', periods=50, freq='D') 
ind = pd.MultiIndex.from_product([current, temp], 
           names=['current_date', 'temp_date']) 
df = pd.DataFrame({'val':np.random.rand(len(ind))}, 
        index=ind) 
df.head() 
#        val 
# current_date temp_date   
# 2015-01-01 2015-01-01 0.309488 
#    2015-01-02 0.697876 
#    2015-01-03 0.621318 
#    2015-01-04 0.308298 
#    2015-01-05 0.936828 

Ora abbiamo Unstack il multiindex: vi mostreremo la prima fetta 4x4 dei dati:

df.unstack().iloc[:4, :4] 
#      val         
# temp_date 2015-01-01 2015-01-02 2015-01-03 2015-01-04 
# current_date            
# 2015-01-01  0.309488 0.697876 0.621318 0.308298 
# 2015-01-02  0.323530 0.751486 0.507087 0.995565 
# 2015-01-03  0.805709 0.101129 0.358664 0.501209 
# 2015-01-04  0.360644 0.941200 0.727570 0.884314 

Ora estrarre la matrice NumPy, e rimodellare a [ nrows x ncols x 1] come specificato nella domanda:

vals = df.unstack().values[:, :, np.newaxis] 
print(vals.shape) 
# (10, 50, 1) 
+0

Ricevo 'ValoreErrore: l'indice contiene voci duplicate, non può rimodellare' quando si tenta di disimpilare. Ho un sacco di righe con alcune che hanno lo stesso 'temp_date' (ma valori diversi). Id deve rimuovere milioni di indici. c'è un modo per evitarlo? Reindicizzare 'temp_date' o qualcosa di simile? –

+0

Oh, non sapevo che avevi duplicati. In tal caso, devi fare una sorta di aggregazione per ottenere il risultato desiderato (e dovrai decidere quale aggregazione è appropriata per i tuoi dati) Una tabella pivot sarebbe un buon approccio: vedi la mia modifica sopra. – jakevdp

Problemi correlati