2013-06-10 14 views
5

Czy w pandach istnieje możliwość pogrupowania danych według MultiIndex? Mam na myśli przejście do funkcji groupby nie tylko kluczyków, ale także kluczy i wartości predefiniowanych kolumn danych?Pandy groupby i Multiindex

a = np.array(['foo', 'foo', 'foo', 'bar', 'bar', 'foo', 'foo'], dtype=object) 
b = np.array(['one', 'one', 'two', 'one', 'two', 'two', 'two'], dtype=object) 
c = np.array(['dull', 'shiny', 'dull', 'dull', 'dull', 'shiny', 'shiny'], dtype=object) 
df = pd.DataFrame([a, b, c]).T 
df.columns = ['a', 'b', 'c'] 
df.groupby(['a', 'b', 'c']).apply(len) 

a b c  
bar one dull  1 
    two dull  1 
foo one dull  1 
      shiny 1 
    two dull  1 
      shiny 2 

Ale co faktycznie chcę jest następująca:

mi = pd.MultiIndex(levels=[['foo', 'bar'], ['one', 'two'], ['dull', 'shiny']], 
        labels=[[0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 1, 0, 1]]) 
#pseudocode 
df.groupby(['a', 'b', 'c'], multi_index = mi).apply(len) 
a b c  
bar one dull  1 
      shiny 0 
    two dull  1 
      shiny 0 
foo one dull  1 
      shiny 1 
    two dull  1 
      shiny 2 

Ja widzę to w tworzeniu dodatkowej owijki na obiekcie GroupBy. A może ta funkcja dobrze pasuje do filozofii pandy i może być zawarta w bibliotece pandy?

Odpowiedz

6

wystarczy ponownie zindeksować i wypełnić!

In [14]: df.groupby(['a', 'b', 'c']).size().reindex(index=mi).fillna(0) 
Out[14]: 
foo one dull  1 
      shiny 1 
    two dull  1 
      shiny 2 
bar one dull  1 
      shiny 0 
    two dull  1 
      shiny 0 
dtype: float64 
+0

I pomyśleć, co mogłoby zostać włączone jest być może kluczowe 'dropna = False'' (które zazwyczaj domyślnie na true), aby obejmowała wszystkich kombinacji dla MI (czyli to, co masz tutaj) .... to jest podobna do nowej funkcji, którą wprowadzamy w wersji 0.11.1: http://pandas.pydata.org/pandas-docs/dev/groupby.html#filtration, która ma tę samą właściwość ... – Jeff

+0

thx, byłoby wspaniały! Moje pierwsze pytanie dotyczyło funkcji crosstab - więc odpowiedziałeś na to również http://stackoverflow.com/questions/17003034/missing-data-in-pandas-crosstab. – norecces

+0

to był @Andy Hayden .... ale na przykład – Jeff

Powiązane problemy