Jak sumować wartości pogrupowane według dwóch kolumn w pandach

21

Mam Pandas DataFrame w ten sposób:

df = pd.DataFrame({
    'Date': ['2017-1-1', '2017-1-1', '2017-1-2', '2017-1-2', '2017-1-3'],
    'Groups': ['one', 'one', 'one', 'two', 'two'],
    'data': range(1, 6)})

    Date      Groups     data  
0  2017-1-1    one       1
1  2017-1-1    one       2
2  2017-1-2    one       3
3  2017-1-2    two       4
4  2017-1-3    two       5

Jak mogę wygenerować nową ramkę danych w następujący sposób:

    Date       one     two 
0  2017-1-1    3        0
1  2017-1-2    3        4
2  2017-1-3    0        5
Kevin
źródło

Odpowiedzi:

16

pivot_table został stworzony do tego:

df.pivot_table(index='Date',columns='Groups',aggfunc=sum)

prowadzi do

         data
Groups    one  two
Date
2017-1-1  3.0  NaN
2017-1-2  3.0  4.0
2017-1-3  NaN  5.0

Osobiście uważam to podejście za znacznie łatwiejsze do zrozumienia, a na pewno bardziej pytoniczne niż skomplikowana operacja grupowania. Następnie, jeśli chcesz określić format, możesz go uporządkować:

df.fillna(0,inplace=True)
df.columns = df.columns.droplevel()
df.columns.name = None
df.reset_index(inplace=True)

co daje ci

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0
Josh D.
źródło
1
Miły! To powinna być zaakceptowana odpowiedź.
tuomastik
@Josh D. To jest fajne i proste! Zgadzam się, że potrzeba trochę mocy mózgu, aby zrozumieć, jak działa grupowanie. Dziękuję Ci!
Kevin,
8

Czarna magia pand:

df = df.groupby(['Date', 'Groups']).sum().sum(
    level=['Date', 'Groups']).unstack('Groups').fillna(0).reset_index()

# Fix the column names
df.columns = ['Date', 'one', 'two']

Wynikające z df:

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0
tuomastik
źródło
Święty! Czarna magia jest tak potężna! Wielkie dzięki!
Kevin
Nie ma za co! Zobacz zaktualizowaną odpowiedź; Uprościłem to wyrażenie i dodałem poprawkę, aby nazwy kolumn były dokładnie takie, jak żądano.
tuomastik,
Myślę, że Twoja poprzednia wersja ma tę zaletę, że można ją zastosować do innych, bardziej skomplikowanych zestawów danych. Skopiowałem go tutaj: df.groupby ([„Data”, „Grupy”, „dane”]) [„dane”]. Sum (). Sum (level = [„Data”, „Grupy”]). Unstack ( „Grupy”). Fillna (0)
Kevin
@Kevin Jeśli ta lub jakakolwiek przyszła odpowiedź rozwiązała problem, zaakceptuj odpowiedź.
tuomastik,