列上的Pandas GroupBy和CumSum

时间:2018-12-13 12:37:46

标签: python pandas

我有一个如下所示的数据集

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计数”列上获得累计金额。

这些是我尝试过的:

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计数”的总和。

2 个答案:

答案 0 :(得分:0)

  

请注意,我将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

答案 1 :(得分:0)

很简单:

解决方案是:

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

我必须在专业级别上求和和分组。