Як підсумовувати значення, згруповані за двома стовпцями в пандах


21

У мене є така DataFrame Pandas:

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

Як я можу генерувати новий DataFrame, як це:

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

Відповіді:


16

pivot_table для цього було зроблено:

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

призводить до

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

Особисто я вважаю такий підхід набагато простішим для розуміння, і, безумовно, більш пітонічним, ніж перекручена групова операція. Тоді, якщо ви хочете, щоб вказаний формат, ви можете просто виправити його:

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

що дає тобі

       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
Приємно! Це має бути прийнятою відповіддю.
tuomastik

@Josh D. Це круто і просто! Я погоджуюся, що для того, щоб зрозуміти, як працює група, потрібна деяка сила мозку. Дякую!
Кевін

8

Чорна магія панди:

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']

Результат 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

Я думаю, що ваша попередня версія має свою перевагу, оскільки її можна застосувати до інших складніших наборів даних. Я скопіював це сюди: df.groupby (['Дата', 'Групи', 'дані']) ['дані']. Sum (). Sum (level = ['Date', 'Groups']). "Групи"). Fillna (0)
Кевін

@Kevin Якщо ця чи будь-яка майбутня відповідь вирішила вашу проблему, прийміть відповідь.
tuomastik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.