【问题标题】:Pandas groupby and aggregate to new columnsPandas groupby 并聚合到新列
【发布时间】:2019-12-22 15:33:46
【问题描述】:

目前我正在尝试将一列转换为几列并相应地汇总其内容,即整理数据框的长度。例如,我们有一个名为 year 的列,其值从 2014 年到 2016 年。其次,我们还有一个列 sales 的金额。我想要的是将year 转换为201420152016,其中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

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

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

    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`
    

    【讨论】:

      【解决方案2】:

      你可以使用DataFrame.pivot_table:

      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
      

      【讨论】:

      • 关于 pandas 中 pivot_table() 函数的好例子。由于year 现在是索引名称,因此我没有将您的答案选为解决方案。但是,它确实有效。
      猜你喜欢
      • 2017-07-20
      • 2019-10-12
      • 1970-01-01
      • 2021-11-01
      • 2017-07-02
      • 2017-06-07
      • 2014-11-23
      • 1970-01-01
      • 2020-11-05
      相关资源
      最近更新 更多