我有一个如下所示的数据集
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计数”的总和。
答案 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()
我必须在专业级别上求和和分组。