以正确的方式通过 pandas 数据框转换组

Convert the group by pandas dataframe in proper way

我有这样的数据框

import pandas as pd

emp_df = pd.DataFrame({'empid':[101,101,101,101,102,102],
                   'salary':[1000,1000,1500,2000,3000,4000],
                   'month':['Feb','Mar','Apr','May','Apr','May'],
                   'year':[2020,2020,2021,2021,2019,2021]})
emp_df

原始数据如下:

我正在尝试获得这样的输出:

到目前为止我得到的是:

方法-1 :

t1 = emp_df.groupby(["empid", "year"]).agg(
    Total_salary=("salary", "sum")
).reset_index()
t1
t1.pivot_table(columns='year')

方法-2 :

t3 = emp_df.groupby(['empid','year']).agg('salary').sum('total').reset_index()
t4 = gp.pivot_table(columns=['empid','year'])
pd.DataFrame(t4.to_records())

基本上我想在这里获得两种类型的输出 -

  1. 一个如上所示,其总和(薪水)per empid w.r.t year wise(JAN-DEC).
  2. 其他人会计算每个 empid w.r.t 财政年度的总和(薪水)(APR-MAR)。

我怎样才能至少在第一步中正确表示数据?这两个步骤在 PowerBI 中都很简单,但我想在笔记本上使用相同的逻辑来正确表示输出。

首次使用 DataFrame.pivot_table 聚合函数 sum:

df = emp_df.pivot_table(index='empid',
                        columns='year', 
                        values='salary', 
                        aggfunc='sum', 
                        fill_value=0)
print (df)
year   2019  2020  2021
empid                  
101       0  2000  3500
102    3000     0  4000

对于第二个,首先为财政年度创建新列并传递给 pivot_table:

d = pd.to_datetime(emp_df['year'].astype(str)+emp_df['month'], format='%Y%b')

emp_df['financial_year'] = np.where(d.dt.month > 3,  d.dt.year, d.dt.year-1)
df2 = emp_df.pivot_table(index='empid',
                        columns='financial_year', 
                        values='salary', 
                        aggfunc='sum', 
                        fill_value=0)
print (df2)

financial_year  2019  2021
empid                     
101             2000  3500
102             3000  4000