【问题标题】:Cumsum with groupby for date accumulationCumsum 与 groupby 用于日期累积
【发布时间】:2021-06-04 16:33:54
【问题描述】:

我正在尝试总结每个月的类别数量并累积前几个月。分组依据需要按月、年和类别。我尝试了不同的使用 cumsum 的方法,但我就是无法得到它。

这是df:

sample=[
{'name':11,'category':'A','year':2017,'month':1},
{'name':22,'category':'A','year':2017,'month':2},
{'name':33,'category':'B','year':2015,'month':1},
{'name':33,'category':'C','year':2017,'month':3},
{'name':33,'category':'B','year':2017,'month':8},
{'name':44,'category':'B','year':2016,'month':4},
{'name':44,'category':'A','year':2017,'month':6},
{'name':55,'category':'C','year':2016,'month':9},
{'name':55,'category':'C','year':2017,'month':5},
{'name':55,'category':'B','year':2017,'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

所以我希望输出添加所有 B(例如)随着月份的进展

所以到 2017 年 11 月,“B”总和应该是 2。

我尝试了不同的变体

cumul_df=sample_counts.groupby(['month','year','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

【问题讨论】:

  • 你的预期输出是什么
  • 嗨,我发布了 2017 年的输出。不想通过添加 2016 年和 2018 年来让它更长,因为它是相同的逻辑/外观
  • 还是很难理解..为什么2017年的A没有0
  • 因为 2017 年 1 月存在 A 类。但是 B 和 C 没有,所以它们是 0
  • 每年每个类别每月累积

标签: python pandas group-by aggregate cumsum


【解决方案1】:

如果我理解正确,这只是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

【讨论】:

  • 您好,感谢您的回复。你能解释一下为什么不是 cumsum 而是 cumcount 吗?我不明白你为什么加1。另外,我不需要指定按类别类型计数吗?再次感谢!
  • cumcount1 开始。你在1 值上是cumsum,这与枚举相同,即cumsum
  • hm,我也不需要指定类别以便函数知道我想按类别以及年和月分组吗?
  • 如果每个(year, month) 对有多个相同类别的实例,解决方案当然会改变。在这种情况下,你需要按月分组,你的方法是正确的,除了你应该在第二次尝试中使用cumsum
  • 嗨,我发布了 2017 年的输出示例,我认为根据您展示的内容,也许 cumcount 也不适用于我的目的?我想我需要通过 group by 创建一个循环并将其自定义为看起来像我的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多