2015-11-03 22 views
6

2 dizinli bir panda DataFrame'im var. (MultiIndex) df.as_matrix(...) gibi bir şeyle bir Numpy Matrix çıkarmak istiyorum ama bu matris (n_rows, 1) şeklindedir. Şekil (n_index1_rows, n_index2_rows, 1)'un bir matrisini istiyorum.Pandalar DataFrame ile MultiIndex'den Numpy Matrix'e

.groupby(...) sonra .values.tolist() veya .as_matrix(...) kullanmak istediğiniz şekli almak için bir yolu var mı?

DÜZENLEME: Veriler

               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 

Bu fikrin türüdür:

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

3B dizi mi istiyorsunuz? Ya da sadece endeksi ve sütun içeren bir 2D dizi? –

+0

3D dizi. Np.array'daki tüm değerler sütun değerleri olmalıdır (dizin değil) –

+0

İstediğiniz çıktıyla bazı örnek veriler sağlayabilir misiniz? – Alexander

cevap

5

Ben ne istediğini, örneğin multiindex unstack olduğunu düşünüyorum

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

Düzenleme: yinelenen indeksleri varsa, istif çalışmaz ve muhtemelen yerine pivot_table istiyorum:

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

İşte unstack tam bir örnek.

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 

Şimdi multiindex unstack: Biz ilk veri 4x4 dilim göstereceğiz: Önce bazı verileri oluşturacağız

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 

Şimdi numpy dizi ayıklamak için yeniden şekillendirmek [ nrows x ncols x 1] soruda belirttiğiniz gibi:

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

“ValueError: İndeks yinelenen girişler içeriyor, kaldırılmaya çalışırken yeniden şekillendirilemiyor”. Bazıları 'temp_date' (ama farklı değerler) olan bir ton satır var. Kimlik milyonlarca indeksi kaldırmalı. Bundan kaçınmanın bir yolu var mı? 'Temp_date' ya da bunun gibi bir şeyi yeniden dizmek? –

+0

Oh - çiftlerin olduğunu bilmiyordum. Bu durumda, istediğiniz sonucu elde etmek için bir çeşit toplama yapmanız gerekir (ve verileriniz için hangi kümenin uygun olduğuna karar vermeniz gerekir) Bir özet tablo iyi bir yaklaşım olacaktır: yukarıdaki düzenlememe bakın. – jakevdp