2016-02-16 15 views
5

Więc mam ramkę danych:podzielić jeden poziom multi indeksu na kolumny

df = pd.DataFrame([["foo","fizz",1],["foo","fizz",2],["foo","buzz",3],["foo","buzz",4],["bar","fizz",6],["bar","buzz",8]],columns=["a","b","c"]) 

     a b  c 
    0 foo fizz 1 
    1 foo fizz 2 
    2 foo buzz 3 
    3 foo buzz 4 
    4 bar fizz 6 
    5 bar buzz 8 

że mogę grupa:

df2 = df.groupby(["a","b"]).sum() 

       c 
    a b 
    bar buzz 8 
     fizz 6 
    foo buzz 7 
     fizz 3 

co jest niesamowite! Ale to, co naprawdę potrzebne, zamiast „c” kolumny wynosi dwie kolumny, „foo” i „bar”:

  foo bar 
    b 
    buzz 7 8 
    fizz 3 6 

Może ktoś sugerują sposób to zrobić? Próbowałem szukać, ale domyślam się, że nie mam odpowiedniej terminologii, więc nie mogłem nic znaleźć.

+0

Spróbuj 'df2.unstack (level = 'a')' –

Odpowiedz

4

Można użyć unstack na to:

df2.unstack(level='a') 

Przykład:

In [146]: df2.unstack(level='a') 
Out[146]: 
     c 
a bar foo 
b 
buzz 8 7 
fizz 6 3 

Po tym dostaniesz multiindexed kolumn. Jeśli trzeba uzyskać płaską dataframe można użyć droplevel z multiindex:

df3 = df2.unstack(level='a') 
df3.columns = df3.columns.droplevel() 

In [177]: df3 
Out[177]: 
a  bar foo 
b 
buzz 8 7 
fizz 6 3 

EDIT

droplevel spadki poziomu z MultiIndex który kolumnach stać po unstack. Domyślnie spada poziom 0, który jest potrzebny dla tej ramki danych.

Kopiuj z help(pd.core.index.MultiIndex.droplevel):

Pomoc na funkcję droplevel w module pandas.core.index:

droplevel (self, poziom = 0) Return Index z wymaganym poziomem usunięte. Jeśli MultiIndex ma tylko 2 poziomów, wynik będzie typu Index, a nie MultiIndex.

Parameters 
---------- 
level : int/level name or list thereof 

Notes 
----- 
Does not check if result index is unique or not 

Returns 
------- 
index : Index or MultiIndex 
+0

Dokładnie to, czego potrzebuję :) można wyjaśnić trochę co droplevel() robi? – binnisb

+1

@binnisb spójrz na edytowaną odpowiedź –

Powiązane problemy