以正确的方式按 Dataframe 转换组

afdcj2ne  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(292)

我有一个 Dataframe

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月至12月)每个empid w.r.t的总金额(工资)。
另一个是计算每个empid w.r.t财政年度(4月至3月)的总额(工资)。
至少在第一步中,如何正确表示数据?这两个步骤在powerbi中都很简单,但我希望在笔记本上使用相同的逻辑来正确表示输出。

vzgqcmou

vzgqcmou1#

首次使用 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

相关问题