2015-11-03 14 views
6

Mam pandas DataFrame z 2 indeksami. (MultiIndex) Chcę wydobyć matrycę Numpy z czymś takim jak df.as_matrix(...), ale ta macierz ma kształt (n_rows, 1). Chcę matrycy kształtu (n_index1_rows, n_index2_rows, 1).Pandas DataFrame z MultiIndex na Numpy Matrix

Czy istnieje sposób użycia .groupby(...), a następnie .values.tolist() lub .as_matrix(...), aby uzyskać pożądany kształt?

EDIT: Dane

               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 

Jest to rodzaj idei:

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

Chcesz tablicę 3D? A może tylko tablica 2D zawierająca indeks i kolumnę? –

+0

Tablica 3D. Wszystkie wartości w zbiorze np.array powinny być wartościami kolumny (nie indeksami). –

+0

Czy możesz podać niektóre przykładowe dane z żądanymi danymi wyjściowymi? – Alexander

Odpowiedz

5

myślę co chcesz jest rozebranie stosu z multiindex, np

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

Edit: jeśli masz duplikaty indeksy, rozkładania nie będzie działać, a ty pewnie chcesz pivot_table zamiast:

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

Oto pełna przykładem unstack. Najpierw będziemy tworzyć pewne dane:

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 

Teraz rozebranie stosu z multiindex: pokażemy pierwszy 4x4 kawałek danych:

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 

Teraz wyodrębnić numpy tablicę, a zmienią się [ nrows x ncols x 1], jak określono w pytaniu:

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

Otrzymuję komunikat "ValueError: Index zawiera zduplikowane wpisy, nie może zmienić kształtu" podczas próby rozpakowania. Mam mnóstwo wierszy z niektórych o tej samej 'temp_date' (ale różne wartości). Muszę rozpakować miliony indeksów. Czy istnieje sposób, aby tego uniknąć? Przeindeksuj 'temp_date' lub coś podobnego? –

+0

Oh - nie wiedziałem, że masz duplikaty. W takim przypadku musisz dokonać pewnego rodzaju agregacji, aby uzyskać pożądany wynik (i będziesz musiał zdecydować, która agregacja jest odpowiednia dla twoich danych). Tabela przestawna byłaby dobrym podejściem: zobacz moją edycję powyżej. – jakevdp

Powiązane problemy