对于数据框中的设置日期范围,使用groupby sum添加零,而不是跳过日期

2024-10-03 21:27:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在(尝试)为三位产品经理和整个团队自动化一些当前手动维护的KPI图表(数据来自SQL server,然后进入Excel,然后进入PPT,然后进入显示监视器)。我可以将销售数据从SQL拉到Python,并且能够在matplotlib中创建必要的协调图表。这是在每周的基础上完成的,因此每个周期都是一个循环的星期一到星期六(星期天没有销售)

销售由产品经理和类别进行标记,因此有时随机销售会在没有标记的情况下出现。我的问题是使用groupby,我只得到销售的天数,而不是整个日期范围。因此,当我尝试创建绘图时,我得到了一个错误,因为序列的输入数量不尽相同

我已经厌倦了三天的独自思考,我终于放弃了

现在数据帧代码如下所示 df=pd.DataFrame(SQL_查询,列=['SO_日期','SALES','PARENT_CATEGORY','PIC']),当前周范围为2019年4月1日至2019年4月6日

我尝试了asfreq、reindex和以下多种变体:

[In] : df['SO_DATE'] = pd.to_datetime(df['SO_DATE'])
df.set_index('SO_DATE').groupby(['PIC','PARENT_CATEGORY'], sort = False)['SALES'].resample('D').asfreq().fillna(0).reset_index()
[Out] :
     PIC        PARENT_CATEGORY  SO_DATE      SALES
0    Curly      Spam          2019-04-01   23209.47
1    Curly      Eggs          2019-04-02   67969.84 
2    Curly      SpamSpam      2019-04-03   19924.44
3    Curly      EggsEggs      2019-04-04   17005.59
4    Curly      EggsSpam      2019-04-06     328.06
5    Moe        Spam          2019-04-01   11750.58
6    Moe        Eggs          2019-04-02   12187.02
7    Moe        SpamSpam      2019-04-03    5003.66
8    Moe        EggsEggs      2019-04-04    6026.33
9    Moe        SpamEggs      2019-04-05   10344.57
10   Moe        EggsSpam      2019-04-06    1816.41
11   Larry      Spam          2019-04-01   11489.23
12   Larry      SpamSpam      2019-04-03    7915.24
13   Larry      EggsEggs      2019-04-04    5993.43
14   Larry      SpamEggs      2019-04-06     332.98



[In]:df[df.PIC.isnull()].groupby(['SO_DATE','SALES']).sum().unstack(fill_value=0).stack()
[Out] : 
                   PARENT_CATEGORY  PIC
SO_DATE    SALES                       
2019-04-02 332.5                 0    0
           851.5                 0    0
           2727.2                0    0
2019-04-03 332.5                 0    0
           851.5                 0    0
           2727.2                0    0
2019-04-05 332.5                 0    0
           851.5                 0    0
           2727.2                0    0


[In]: nopm = df[df.PIC.isnull()]
nopm.set_index('SO_DATE')['SALES'].resample('D').asfreq().fillna(0).reset_index()
[Out]:
 SO_DATE   SALES
0 2019-04-02   851.5
1 2019-04-03  2727.2
2 2019-04-04     0.0
3 2019-04-05   332.5


[In] : 

pd.DataFrame(index = new_index,columns ={'Curly':df[df['PIC']=='Curly'].groupby('SO_DATE')['SALES'].sum()})
[Out] :
           Curly
2019-04-01   NaN
2019-04-02   NaN
2019-04-03   NaN
2019-04-04   NaN
2019-04-05   NaN
2019-04-06   NaN

我想要的是

     PIC        PARENT_CATEGORY  SO_DATE      SALES
0    Curly      Spam          2019-04-01   23209.47
1    Curly      Eggs          2019-04-02   67969.84 
2    Curly      SpamSpam      2019-04-03   19924.44
3    Curly      EggsEggs      2019-04-04   17005.59
4    Curly      SpamEggs      2019-04-05       0.00
5    Curly      EggsSpam      2019-04-06     328.06
6    Moe        Spam          2019-04-01   11750.58
7    Moe        Eggs          2019-04-02   12187.02
8    Moe        SpamSpam      2019-04-03    5003.66
9    Moe        EggsEggs      2019-04-04    6026.33
10   Moe        SpamEggs      2019-04-05   10344.57
11   Moe        EggsSpam      2019-04-06    1816.41
12   Larry      Spam          2019-04-01   11489.23
13   Larry      Eggs          2019-04-02       0.00
14   Larry      SpamSpam      2019-04-03    7915.24
15   Larry      EggsEggs      2019-04-04    5993.43
16   Larry      SpamEggs      2019-04-05       0.00
17   Larry      EggsSpam      2019-04-06     332.98
18   NaN        Spam          2019-04-01       0.00
19   NaN        Eggs          2019-04-02      851.0
20   NaN        SpamSpam      2019-04-03     2727.2
21   NaN        EggsEggs      2019-04-04       0.00
22   NaN        SpamEggs      2019-04-05      332.5
23   Nan        EggsSpam      2019-04-06       0.00

Or
when doing a groupby for any PIC (including the NULL!) get this--
              SALES
 2019-04-01     0.0
 2019-04-02   851.0
 2019-04-03  2727.2
 2019-04-04     0.0
 2019-04-05   332.5
 2019-04-06     0.0

Tags: dfdateindexsonanspameggssales