2013-06-10 26 views
5

Gibt es irgendeine Möglichkeit in Pandas, Daten durch MultiIndex zu gruppieren? Damit meine ich die Übergabe an Groupby-Funktion nicht nur Schlüssel, sondern Schlüssel und Werte, um Dataframe-Spalten vordefinieren?Pandas groupby und 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 

Aber was ich wirklich will, ist die folgende:

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 

Die Art, wie ich es sehe auf groupby Objekt in Schaffung zusätzlicher Wrapper ist. Oder vielleicht diese Funktion feeds gut zu Pandas Philosophie und es kann in der Pandas Lib enthalten sein?

Antwort

6

nur reindex und fillna!

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

denke ich, was aufgenommen werden könnte, ist vielleicht ein Stichwort '' dropna = False'' (die in der Regel standardmäßig auf True) zu enthalten alle Kombinationen für eine Meile (das ist, was Sie hier) .... das ist ähnlich zu einer neuen Funktion, die wir in 0.11.1 einführen: http://pandas.pydata.org/pandas-docs/dev/groupby.html#filtration, die dieselbe Eigenschaft hat ... – Jeff

+0

thx, wäre es groß! Meine erste Frage war die Kreuztabellenfunktion - also hast du sie auch beantwortet http://stackoverflow.com/questions/17003034/missing-data-in-pandas-crosstab. – norecces

+0

das war @Andy Hayden .... aber np – Jeff