Pandas 分组求和、排序和转置

Pandas 分组求和、排序和转置,pandas,pandas-groupby,Pandas,Pandas Groupby,我是熊猫和groupby功能方面的新手。 我有如下所示的数据框,这是客户的交易数据,如下所示,我想根据客户的总金额找出前两名DprtmntperCus\u No Cus_No Date Dprtmnt Amount 111 6-Jun-18 AAA 100 111 6-Jun-18 AAA 50 111 8-Jun-18 BBB 1

我是熊猫和groupby功能方面的新手。 我有如下所示的数据框,这是客户的交易数据,如下所示,我想根据客户的总金额找出前两名
Dprtmnt
per
Cus\u No

Cus_No     Date     Dprtmnt          Amount
111     6-Jun-18      AAA              100
111     6-Jun-18      AAA              50
111     8-Jun-18      BBB              125
111     8-Aug-18      CCC              130
111     12-Dec-18     BBB              200
111     15-Feb-17     AAA              10
111     18-Jan-18     AAA              20
222     6-Jun-18      DDD              100
222     6-Jun-18      AAA              50
222     8-Jun-18      AAA              125
222     8-Aug-18      DDD              130
222     12-Dec-18     AAA              200
222     15-Feb-17     CCC              10
222     18-Jan-18     CCC              20
我的预期输出如下所示

    Cus_No     Top1D Top1Sum    Top1_Frqnc  Top2D   Top2Sum  Top2_Frqnc
       111      BBB     325          2        AAA      180       4
       222      AAA     375          3        DDD      230       2
首先使用
sum
size
进行聚合,排序并获取前2名,最后通过
map
join
进行重塑并创建新列名:

df = (df.groupby(['Cus_No','Dprtmnt'])['Amount']
        .agg([('Sum','sum'),('Frqnc','size')])
        .sort_values('Sum', ascending=False)
        .groupby(level=0).head(2))

df = (df.set_index(df.groupby(level=0).cumcount().add(1).astype(str), append=True)
        .reset_index(level=1)
        .unstack()
        .sort_index(axis=1, level=1))
df.columns = df.columns.map(''.join)
df = df.reset_index()
print (df)
RangeIndex(start=0, stop=14, step=1)
   Cus_No Dprtmnt1  Frqnc1  Sum1 Dprtmnt2  Frqnc2  Sum2
0     111      BBB       2   325      AAA       4   180
1     222      AAA       3   375      DDD       2   230