Pandas GroupBy и CumSum на колонке - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть набор данных, который выглядит следующим образом

doc_created_month   doc_created_year    speciality      doc_id count
8                   2016                Acupuncturist   1           
2                   2017                Acupuncturist   1           
4                   2017                Acupuncturist   1           
4                   2017                Allergist       1           
5                   2018                Allergist       1           
10                  2018                Allergist       2   

Я хочу сгруппировать по месяцам, годам и специальностям и получить кумулятивную сумму в столбце 'doc_id count'.

Это следующее, что я пробовал:

1) docProfileDf2.groupby(by=['speciality','doc_created_year','doc_created_month']).sum().groupby(level=[0]).cumsum()

2) docProfileDf2.groupby(['doc_created_month','doc_created_year','speciality'])['doc_id count'].apply(lambda x: x.cumsum())

Ни один из них не возвращает надлежащую накопленную сумму.Любое решение может помочь.

Ожидаемый результат должен быть:

doc_created_month   doc_created_year    speciality          doc_id count
    8                   2016                Acupuncturist   1           
    2                   2017                Acupuncturist   2           
    4                   2017                Acupuncturist   3           
    4                   2017                Allergist       1           
    5                   2018                Allergist       2           
    10                  2018                Allergist       4

Для каждого года, месяца и специальности я хочу сумму 'doc_id count'

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Это просто:

Решение:

df.groupby(by=['speciality','doc_created_year','doc_created_month']).sum().groupby(level=[0]).cumsum()

Мне пришлось суммировать и группировать на специальном уровне.

0 голосов
/ 13 декабря 2018

Обратите внимание, что я изменил doc_id count на doc_id_count

Сначала вы набираете groupby('speciality'), чтобы сгруппировать ваши данные по этому столбцу.Второй шаг - позвонить apply().Затем вы примените функцию к каждой группе.В этом случае мы выполняем еще один groupby для других необходимых столбцов и далее вызываем group.sum().cumsum(), чтобы получить желаемый результат.

from io import StringIO
import pandas as pd

data = """
doc_created_month   doc_created_year    speciality      doc_id_count
8                   2016                Acupuncturist   1           
2                   2017                Acupuncturist   1           
4                   2017                Acupuncturist   1           
4                   2017                Allergist       1           
5                   2018                Allergist       1           
10                  2018                Allergist       2   
"""

df = pd.read_csv(StringIO(data), sep='\s+')

(df.groupby('speciality')
    .apply(lambda df_: df_.groupby(['doc_created_year', 'doc_created_month'])
           .sum().cumsum())
)

, который выдает:

                                                  doc_id_count
speciality    doc_created_year doc_created_month              
Acupuncturist 2016             8                             1
              2017             2                             2
                               4                             3
Allergist     2017             4                             1
              2018             5                             2
                               10                            4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...