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.