如何对多个列上的数据集进行分组并同时进行不同的聚合? 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的主要内容,如果未能解决你的问题,请参考以下文章
利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)
数据分析—Pandas 中的分组聚合Groupby 高阶操作