首页 > 解决方案 > Pandas GroupBy 和 CumSum 在列上

问题描述

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

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'的cumsum

标签: pythonpandas

解决方案


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

推荐阅读