按分组并聚合到新列

2024-10-01 04:59:08 发布

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

目前,我正在尝试将一列强制转换为多个列,并相应地对其内容求和,即整理数据帧的长度。例如,我们有一个名为year的列,其值从2014年到2016年。其次,我们还有一个sales列,其值为amount。我想把year转换成20142015&2016与特定年份对应的sales之和。原始的sales可以删除,也可以显示所有年份的总销售额

通过使用Pandas groupby()函数、agg()和transform()我试图找到一个解决方案,但没有任何优势firstsecond。也就是说,我似乎无法找到创建2014等列的解决方法

假设以下数据帧:

df = pd.DataFrame({'CustomerId':[1,1,1,2,2,2,3,3,3,4,4,4,5,5,5],
                   'CustomerName': ['McNulty','McNulty','McNulty',
                                    'Bunk','Bunk','Bunk',
                                    'Joe','Joe','Joe',
                                    'Rawls','Rawls','Rawls',
                                    'Davis','Davis','Davis'],
                  'Sales':np.random.randint(1000,1500,15),
                  'Year':[2014,2015,2016,2014,2015,2016,2014,2015,2016,
                         2014,2015,2016,2014,2015,2016]})

预期产出应如下:

CustomerId CustomerName Sales 2014 2015 2016
1          McNulty      3300  1050 1050 1200
2          Bunk         3500  1100 1200 1200
3          Joe          3900  1300 1300 1300
4          Rawls        3500  1000 1000 1500
5          Davis        3800  1600 1100 1100

Tags: 数据内容amountyear整理年份salesjoe
2条回答

您可以使用^{}

df.pivot_table(index=['CustomerId', 'CustomerName'],
               columns=['Year'],
               values='Sales',
               margins=True,
               margins_name='Sales',
               aggfunc='sum').reset_index().iloc[:-1]

[输出]

Year CustomerId CustomerName  2014  2015  2016  Sales
0             1      McNulty  1006  1325  1205   3536
1             2         Bunk  1267  1419  1257   3943
2             3          Joe  1348  1217  1323   3888
3             4        Rawls  1091  1390  1330   3811
4             5        Davis  1075  1316  1481   3872

使用pivot_table并展平多索引列,最后计算axis=1上的sum

piv = df.pivot_table(index=['CustomerId', 'CustomerName'], columns='Year').reset_index()

piv.columns = [f'{c1}_{c2}'.strip('_') for c1, c2 in piv.columns]

piv['Sales'] = piv.filter(like='Sales').sum(axis=1)

输出

   CustomerId CustomerName  Sales_2014  Sales_2015  Sales_2016  Sales
0           1      McNulty        1144        1007        1108   3259
1           2         Bunk        1146        1451        1169   3766
2           3          Joe        1455        1070        1351   3876
3           4        Rawls        1263        1004        1422   3689
4           5        Davis        1428        1431        1399   4258`

相关问题 更多 >