【问题标题】:Group by day, sum up same product numbers, then group by week and sum up products by product number, then group by week and sum up all products按天分组,总结相同的产品编号,然后按周分组并按产品编号总结产品,然后按周分组并总结所有产品
【发布时间】:2020-12-23 21:38:52
【问题描述】:

我有一个数据框 df,例如:

date       | productnumber | kpi
2018-04-02 | 1             | 0.3
2018-04-02 | 1             | 0.7
2018-04-02 | 1             | 0.5
2018-04-02 | 2             | 0.1
2018-04-02 | 2             | 0.1
2018-04-02 | 2             | 0.8
2018-04-02 | 3             | 0.1
2018-04-02 | 3             | 0.2
2018-04-02 | 4             | 1.8
2018-04-06 | 1             | 3.2
2018-04-06 | 2             | 0.1
2018-04-06 | 2             | 0.2
2018-04-06 | 4             | 0.4

首先我需要按相同的日期和产品编号进行分组,以总结同一天所有相同产品的 kpi。

这应该是可能的:

df = df.groupby(["date", "productnumber "]).sum()

date       | productnumber | kpi
2018-04-02 | 1             | 1.5
2018-04-02 | 2             | 1.0
2018-04-02 | 3             | 0.3
2018-04-02 | 4             | 1.8
2018-04-06 | 1             | 3.2
2018-04-06 | 2             | 0.3
2018-04-06 | 4             | 0.4

然后我需要按productnumber和week总结所有产品

最终结果应该是这样的:

date       | productnumber | kpi
2018-04-02 | 1             | 4.7
2018-04-02 | 2             | 1.3
2018-04-02 | 3             | 0.3
2018-04-02 | 4             | 2.2

那我需要把所有的kpi

date       | kpi
2018-04-02 | 8.2

如果我的日期是 2018 年 31 月 12 日,而这一天是一年中的一个星期一,那将是 1,因此仅使用 week_of_year 创建一个列并按此分组是行不通的。

我该如何解决这个问题?

【问题讨论】:

  • 产品 4。为什么在第二个 group 之后预期 kpi = 0.4 而不是 2.2(1.8 + 0.4)?
  • 2018-04-01/2018-04-07 期间为实际日期:2018-04-01, 2018-04-06
  • 对不起,你当然是对的。编辑了第二个“分组依据”(如何在 cmets 中将背景设为灰色?)。
  • here 示例

标签: pandas date group-by


【解决方案1】:

因为如果使用Grouper,这里会显示下周的值,一种可能的解决方案是在您的解决方案之前减去7 days,并在Grouper 中使用closed='left'

df['date'] = pd.to_datetime(df['date'])

df['date'] -= pd.Timedelta('7D')

df = df.groupby(["date", "productnumber"]).sum()
print (df)
                          kpi
date       productnumber     
2018-03-26 1              1.5
           2              1.0
           3              0.3
           4              1.8
2018-03-30 1              3.2
           2              0.3
           4              0.4

df = df.groupby([pd.Grouper(freq='W-Mon', level="date", closed='left'), 
                            "productnumber"]).sum()
print (df)
                          kpi
date       productnumber     
2018-04-02 1              4.7
           2              1.3
           3              0.3
           4              2.2

最后一个过滤器和第一级的聚合总和可以使用这个快捷方式:

df = df.query('kpi > 1').sum(level=0)
print (df)
            kpi
date           
2018-04-02  8.2 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-06
    • 1970-01-01
    相关资源
    最近更新 更多