2017-02-02 16 views
7

Próbuję użyć grupy, aby utworzyć nową ramkę danych, ale potrzebuję, aby indeks multi był spójny. Niezależnie od tego, czy istnieje kategoria sub, chciałbym to być tworzone jak następuje:Pandy Groupby Spójne poziomy, nawet jeśli puste

import pandas as pd 

df = pd.DataFrame(
    {'Cat 1':['A','A','A','B','B','B','B','C','C','C','C','C','D'], 
    'Cat 2':['A','B','A','B','B','B','A','B','B','B','B','B','A'], 
    'Num': [1,1,1,1,1,1,1,1,1,1,1,1,1]}) 
print df.groupby(['Cat 1','Cat 2']).sum() 

Przy wyjściu, który wygląda tak:

   Num 
Cat 1 Cat 2  
A  A  2 
     B  1 
B  A  1 
     B  3 
C  B  5 
D  A  1 

Ale chciałbym to wyglądać

   Num 
Cat 1 Cat 2  
A  A  2 
     B  1 
B  A  1 
     B  3 
C  A  Nan 
     B  5 
D  A  1 
     B  Nan 

czytałem różne dane, które następnie dodaje kolumnę w tym formacie, tak otrzymaną macierz będzie wyglądać następująco:

   Num  Num_added_later 
Cat 1 Cat 2     
A  A  2   12 
     B  1   5 
B  A  1   5 
     B  3   3 
C  A  Nan  5 
     B  5   5 
D  A  1   1 
     B  Nan  3 

Odpowiedz

5

Można utworzyć nowy indeks oparty na dwóch Cat kolumny i reindex swoje rezultaty:

import pandas as pd 
new_index = pd.MultiIndex.from_product([df["Cat 1"].unique(), df["Cat 2"].unique()], names = ["Cat 1", "Cat 2"]) 

df.groupby(['Cat 1','Cat 2']).sum().reindex(new_index) 

enter image description here

4

To hack1! Proszę używać @ Psidom za odpowiedź

df.groupby(['Cat 1','Cat 2']).sum().unstack().stack(dropna=False) 

      Num 
Cat 1 Cat 2  
A  A  2.0 
     B  1.0 
B  A  1.0 
     B  3.0 
C  A  NaN 
     B  5.0 
D  A  1.0 
     B  NaN 

Ok, może mniej hack ale ...

enter image description here

+3

Nie sądzę, jest to więc hacky. Intencja nie jest również przekazywana, ale mimo to jest całkiem sprytna. –

+1

Podoba mi się ten hack! – MaxU

Powiązane problemy