代码之家  ›  专栏  ›  技术社区  ›  The Great

Pandas-计算并转向前两年的收入

  •  2
  • The Great  · 技术社区  · 2 年前

    我有一个数据帧,如下所示

    df = pd.DataFrame(
        {'stud_id' : [101, 101, 101, 101, 
                      101, 102, 102, 102],
         'sub_code' : ['CSE01', 'CSE01', 'CSE01', 
                       'CSE01', 'CSE02', 'CSE02',
                       'CSE02', 'CSE02'],
         'ques_date' : ['10/11/2022', '06/06/2022','09/04/2022', '27/03/2022', 
                    '13/05/2010',  '10/11/2021','11/1/2022', '27/02/2022'],
         'revenue' : [77, 86, 55, 90, 
                    65, 90, 80, 67]}
    )
    df['ques_date'] = pd.to_datetime(df['ques_date'])
    

    我想做以下事情

    a) 根据我们组织的FY日历计算自定义财政年度。也就是说,10月至12月是第一季度,1月至3月是第二季度,4月至6月是第三季度,7月至9月是第四季度。

    b) 按stud_id分组

    c) 计算前两个自定义财年的收入总和(从特定日期=2022年12月20日)。例如,如果我们在2023财年,我想分别获得2022财年和2021财年客户的收入总和

    所以,我根据这篇帖子尝试了以下内容 here

    df['custom_qtr'] = pd.to_datetime(df['ques_date'], dayfirst=True).dt.to_period('Q-SEP')
    date_1 = pd.to_datetime('20-12-2022') # CUT-OFF DATE
    df['custom_year'] = df['custom_qtr'].astype(str).str.extract('(?P<year>\d+)')
    df['date_based_qtr']  = date_1.to_period('Q-SEP')
    df['custom_date_year'] = df['date_based_qtr'].astype(str).str.extract('(?P<year>\d+)')
    df['custom_year'] = df['custom_year'].astype(int)
    df['custom_date_year'] = df['custom_date_year'].astype(int)
    df['diff'] = df['custom_date_year'].sub(df['custom_year'])
    df = df[df['diff'].isin([1,2])]
    out_df = df.pivot_table("revenue", index=['stud_id'],columns=['custom_year'],aggfunc=['sum']).add_prefix('rev_').reset_index().droplevel(0,axis=1)
    

    但这导致了如下不一致的输出列

    enter image description here

    我希望我的输出如下

    enter image description here

    更新的输出

    enter image description here

    1 回复  |  直到 2 年前
        1
  •  2
  •   akuiper    2 年前

    似乎你只需要首先对季度-年度进行微调,过滤到只包括2021和2022行,然后总结&支点

    (df.assign(
        qyear = pd.to_datetime(df['ques_date'], dayfirst=True).dt.to_period('Q-SEP').dt.qyear
      )[lambda x: x.qyear.isin([2021, 2022])]
      .assign(qyear=lambda x: x.qyear.astype('category').cat.set_categories([2021, 2022]))
      .groupby(['stud_id', 'qyear'])
      .revenue.sum()
      .unstack(level=1)
      .add_prefix('rev_')
      .reset_index(drop=False))
    
    #qyear  stud_id  rev_2021  rev_2022
    #0          101         0       231
    #1          102         0       157
    

    对于更新:

    df['qyear'] = pd.to_datetime(df['ques_date'], dayfirst=True).dt.to_period('Q-SEP').dt.qyear.astype('category').cat.set_categories([2021, 2022])
    df.groupby(['stud_id', 'sub_code', 'qyear']).revenue.sum().unstack(level=1, fill_value=0).add_prefix('rev_').reset_index(drop=False)
    
    sub_code  stud_id qyear  rev_CSE01  rev_CSE02
    0             101  2021          0          0
    1             101  2022        231          0
    2             102  2021          0          0
    3             102  2022          0        157