2017-06-02 46 views
7

Używam agregatów pand i groupby do agregacji. Robię, co następuje:Pokaż grupę przy każdym rekordzie w grupie przez

data = {'ac' : ['a','a','a','a','a','a','a','a','b','b','b','b','b'], 
     'cls' ['wwww','wwww','wwww','xxxx','xxxx','zzzz','zzzz','yyyy','wwww','xxxx','zzzz','zzzz','yyyy'], 
     'pl' : [1,1,1,1,1,1,1,1,1,1,1,1,1]} 

df = pd.DataFrame(data) 

grouped = df.groupby(['ac','cls']).agg({'pl':np.sum}) 


      pl 
    ac cls  
    a wwww 3 
     xxxx 2 
     yyyy 1 
     zzzz 2 
    b wwww 1 
     xxxx 1 
     yyyy 1 
     zzzz 2 

Czy istnieje sposób, aby zrobić groupby gdzie będzie wypełnienie kolumny ac tak, że brzmi jak następuje?

   pl 
    ac cls  
    a wwww 3 
    a xxxx 2 
    a yyyy 1 
    a zzzz 2 
    b wwww 1 
    b xxxx 1 
    b yyyy 1 
    b zzzz 2 

Odpowiedz

3

Chcesz zresetować indeks:

import pandas as pd 

import numpy as np 

data = {'ac': ['a','a','a','a','a','a','a','a','b','b','b','b','b'], 
     'cls': ['wwww','wwww','wwww','xxxx','xxxx','zzzz','zzzz','yyyy','wwww','xxxx','zzzz','zzzz','yyyy'], 
     'pl': [1,1,1,1,1,1,1,1,1,1,1,1,1]} 

df = pd.DataFrame(data) 

grouped = df.groupby(['ac','cls']).agg({'pl':np.sum}) 
grouped.reset_index(inplace=True) 

print grouped 

Drukuje:

ac cls pl 
0 a wwww 3 
1 a xxxx 2 
2 a yyyy 1 
3 a zzzz 2 
4 b wwww 1 
5 b xxxx 1 
6 b yyyy 1 
7 b zzzz 2 
+0

Dzięki, nie zdawałem sobie sprawy (choć powinienem), że GroupBy stworzył nowe indeksy, i że prosty reset_index to naprawi. Zaznaczam to jako odpowiedź, która rozwiązała mój problem, nawet jeśli tak jest, ponieważ prowadzi operację ściśle do danej ramki danych, a nie jako ustawienie globalne. –

+0

Możesz zasadniczo uzyskać ten sam wynik, ale bez dodatkowej kolumny używając opcji 'level':' grouped.reset_index (level = 0) ' – JohnE

2

Teraz wyraźnie widać, że elementy po lewej stronie znajdują się w indeksie, jak wskazano przez położenie nagłówka kolumny po prawej stronie.

Sterowanie odbywa się za pomocą opcji pandy o nazwie display.multi_sparse. Można go wyłączyć z pd.set_option('display.multi_sparse', False) lub można to zrobić czasowo z pd.option_context

with pd.option_context('display.multi_sparse', False): 
    print(grouped) 

     pl 
ac cls  
a wwww 3 
a xxxx 2 
a yyyy 1 
a zzzz 2 
b wwww 1 
b xxxx 1 
b yyyy 1 
b zzzz 2 
+0

Dzięki, nie zdawałem sobie sprawy (chociaż powinienem), że groupby stworzył nowe indeksy i że prosty reset_index to naprawi. Zaznaczam to jako odpowiedź, która rozwiązała mój problem, nawet jeśli tak jest, ponieważ prowadzi operację ściśle do danej ramki danych, a nie jako ustawienie globalne. –

+0

@BinoyFernandez jest jasne, że asongtoruin ma to, czego naprawdę potrzebujesz. Ale chciałem udzielić odpowiedzi na twoje aktualne pytanie, aby inni mogli je znaleźć. Zauważ też, że inne rozwiązanie nie odtwarza podanych wyników. Nie można tego zrobić bez opuszczania kolumn w indeksie. – piRSquared

0

użytkowania as_index=True

In [748]: df.groupby(['ac', 'cls'], as_index=False).agg({'pl': np.sum}) 
Out[748]: 
    ac cls pl 
0 a wwww 3 
1 a xxxx 2 
2 a yyyy 1 
3 a zzzz 2 
4 b wwww 1 
5 b xxxx 1 
6 b yyyy 1 
7 b zzzz 2