问题描述
我正在尝试对每个月的类别数量求和并累计前几个月。 group by 需要按月、年和类别。我尝试了不同的使用 cumsum 的方法,但我就是不明白。
这是df:
sample=[
{'name':11,'category':'A','year':2017,'month':1},{'name':22,'month':2},{'name':33,'category':'B','year':2015,'category':'C','month':3},'month':8},{'name':44,'year':2016,'month':4},'month':6},{'name':55,'month':9},'month':5},'month':11}]
sample_df=pd.DataFrame(sample)
我按月、年、类别分组,按月汇总
sample_counts = sample_df.groupby(['month','year','category']).agg({
'category': 'count',}).rename(columns={'category':'category_count'}).reset_index()
sample_counts 的输出是这样的:
month year category category_count
1 2015 B 1
1 2017 A 1
2 2017 A 1
3 2017 C 1
4 2016 B 1
5 2017 C 1
6 2017 A 1
8 2017 B 1
9 2016 C 1
11 2017 B 1
因此,到 2017 年 11 月,“B”和应该是 2。
我尝试了
的不同变体cumul_df=sample_counts.groupby(['month','category']).sum().groupby(level=0).cumsum().reset_index()
我希望 FINAL 输出 看起来像这样(仅在下面显示 2017 年,但 2016 年和 2018 年将是相同的逻辑和外观,并将在下表中):>
Category Month Year Cumulative_By_Category
A 1 2017 1
A 2 2017 2
A 3 2017 2
A 4 2017 2
A 5 2017 2
A 6 2017 3
A 7 2017 3
A 8 2017 3
A 9 2017 3
A 10 2017 3
A 11 2017 3
A 12 2017 3
B 1 2017 0
B 2 2017 0
B 3 2017 0
B 4 2017 0
B 5 2017 0
B 6 2017 0
B 7 2017 0
B 8 2017 1
B 9 2017 1
B 10 2017 1
B 11 2017 2
B 12 2017 2
C 1 2017 0
C 2 2017 0
C 3 2017 1
C 4 2017 1
C 5 2017 2
C 6 2017 2
C 7 2017 2
C 8 2017 2
C 9 2017 2
C 10 2017 2
C 11 2017 2
C 12 2017 2
解决方法
如果我理解正确,这只是cumcount
:
sample_df['cat_count'] = sample_df.groupby(['year','category']).cumcount() + 1
输出:
name category year month cat_count
0 11 A 2017 1 1
1 22 A 2017 2 2
2 33 B 2015 1 1
3 33 C 2017 3 1
4 33 B 2017 8 1
5 44 B 2016 4 1
6 44 A 2017 6 3
7 55 C 2016 9 1
8 55 C 2017 5 2
9 55 B 2017 11 2