如何对多个列上的数据集进行分组并同时进行不同的聚合? Python

Posted

技术标签:

【中文标题】如何对多个列上的数据集进行分组并同时进行不同的聚合? Python【英文标题】:How to Groupby a dataset on several columns and do different aggregation at the same time? Python 【发布时间】:2021-01-31 01:29:25 【问题描述】:

我需要完成几件事:

按国家和产品分组列

执行聚合得到:

 - percentage of my Products column for each country
 - Calculate the sum of columns Volume and Profit and UnrealizedProfit (2 columns 1st=Volume, 2nd= Profit + UnrealizedProfit)

同时显示其他列

我的数据框:

   Country       Sector       Products     Volume    Profit   UnrealizedProfit      
0  Country_1     Sector1      Product_1     50         5            4
1  Country_1     Sector2      Product_2     100        6            3
2  Country_2     Sector1      Product_1     150        3            -1
3  Country_2     Sector2      Product_2     200        -1           5
4  Country_1     Sector1      Product_2     100        7            10
5  Country_2     Sector2      Product_2     200        -3           -1
6  Country_2     Sector1      Product_1     150        2            -1
7  Country_1     Sector2      Product_1     50         5            -3

注意:我的实际数据框中有几千行。

所需的输出如下所示:

   Country       Sector       Products     Product%   Volume    ExpectedProfit        
0  Country_1     Sector1      Product_1     0.138      100        11
1  Country_1     Sector2      Product_2     0.861      200        26
2  Country_2     Sector1      Product_1     0.667      300        3
3  Country_2     Sector2      Product_2     0.333      400        0

我一次只能进行一次聚合,但不是两次。 到目前为止:

df = (data1.groupby('Country')['Products']
           .value_counts(normalize=True,sort=False)
           .reset_index(name='Product%'))
print (df)

这段代码给了我:

   Country       Products     Product%
0  Country 1     Product 1     0.138
1  Country 1     Product 2     0.861
2  Country 2     Product 1     0.667
3  Country 2     Product 2     0.333

产品的每个频率都是基于相关国家 --> sum(Country1) =100%, sum(Country2)=100%...

对于我设法复制的卷:

df = (data1.groupby(['Country','Product'])['Volume']
      .sum()
      .reset_index(name='Volume'))

我在 groupby() 中添加了产品,因为我想查看每个产品和国家/地区的数量。

目标是结合 Products% 和 Volume 并添加 ExpectedProfit 如前所述,我不知道如何将其结合起来并为利润进行聚合(利润+未实现利润) 以及显示部门(我猜部门可以包含在 Groupby() 中,因为每个部门都有几个产品。

感谢您的帮助!

【问题讨论】:

请分享您的数据框样本以进行处理。 我添加了一个示例 【参考方案1】:

全部总结:

new_df = pd.DataFrame()
grouper = df.groupby(["Country", "Products"])
new_df["ExpectedProfit"] = grouper.Profit.sum() + grouper.UnrealizedProfit.sum()
new_df["Volume"] =  grouper.Volume.sum()
new_df["%"] = df.groupby(['Country']).Products.value_counts(normalize=True,sort=False)
new_df

输出:

                     ExpectedProfit  Volume    %
Country   Products                              
Country_1 Product_1              11     100  0.5
          Product_2              26     200  0.5
Country_2 Product_1               3     300  0.5
          Product_2               0     400  0.5

有部门

grouper = df.groupby(["Country", "Products", "Sector"])

没有扇区:

grouper = df.groupby(["Country", "Products"])
result = grouper.Profit.sum() + grouper.UnrealizedProfit.sum()
result = result.reset_index(name="ExpectedProfit")

结果部门:

     Country   Products   Sector  ExpectedProfit
0  Country_1  Product_1  Sector1               9
1  Country_1  Product_1  Sector2               2
2  Country_1  Product_2  Sector1              17
3  Country_1  Product_2  Sector2               9
4  Country_2  Product_1  Sector1               3
5  Country_2  Product_2  Sector2               0

结果没有扇区:

     Country   Products  ExpectedProfit
0  Country_1  Product_1              11
1  Country_1  Product_2              26
2  Country_2  Product_1               3
3  Country_2  Product_2               0

【讨论】:

实际上对我来说最重要的是将 Product % 和 Volume 放在相同的输出上 基本上所有聚合列都显示在最终数据框中

以上是关于如何对多个列上的数据集进行分组并同时进行不同的聚合? Python的主要内容,如果未能解决你的问题,请参考以下文章

TSQL 分组集(Grouping Sets)

Pyspark - 一次聚合数据框的所有列[重复]

利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)

数据分析—Pandas 中的分组聚合Groupby 高阶操作

是否可以结合多个字段进行 Solr 分面,例如 RMDB 中多个列上的不同?

pandas分组与聚合