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

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

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

Ś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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.