如何在 Pandas 中的两列上使用聚合函数而不弄乱索引?

How to use an aggregate function on two columns in Pandas without messing up the index?

我遇到这个问题,使用 agg(['sum', 'count']) 输出 "subcolumns" 而不是新的独占列。

这是个问题,因为我需要将结果导出到 csv 以供 salesforce 上传,而子列的格式混乱。

所以,首先是这个数据框:

Order ID | Company ID | Company Name | Product   | Date    | Units in order | Units delivered | Platform
1          J01          John's        Bubblegum   01-01-20     100             100            On Prem
2          J01          John's        Bubblegum   01-01-20     200             150            On Prem
3          M01          Mary's        Jawbreakers  01-01-20    100             100            Online 

之后,我从中创建了一个子集 DF

Subset = df[['Company ID', 'Company Name', 'Platform', 'Date', 'Units in order', 'Units delivered']]

然后我继续分组并在子集上应用聚合以获得单位列的总和和计数(以了解有多少订单)

Subset = Subset.groupby(['Company ID', 'Company Name', 'Platform', 'Date'])['Units in order', 'Units delivered'].agg(['sum', 'count']).reset_index()

但是,这会弄乱列的索引。而不是输出

Company ID | Company Name | Platform | Date | Sum of UIO | Count of UIO | Sum of UD | Count of UD

正在输出

Company ID | Company Name | Platform | Date | Sum of UIO | Units in order | Units delivered |       
                                                            sum | count      sum | count

有效创建 4 "subcolumns"。当然,在导出为 CSV 时,这会创建一个 "format",除 pandas.

外,其他任何内容都无法正确读取该 "format"

如何解决这个问题,为什么会这样?起初我以为是因为命名冲突,因为我有 2 个总和和 2 个计数列,但我尝试重命名它们并没有解决问题。

您可以使用 pandas NamedAgg 解决此问题,如果没记错的话,pandas 0.25.0python 3.5.0 之后就可以使用。代码如下:

Subset = Subset.groupby(['Company ID', 'Company Name', 'Platform', 'Date']).agg(
   Units_in_order_sum = pd.NamedAgg(column='Units in order', aggfunc='sum'),
   Units_in_order_count = pd.NamedAgg(column='Units in order', aggfunc='count'),
   Units_delivered_sum = pd.NamedAgg(column='Units delivered',aggfunc='sum'),
   Units_delivered_count = pd.NamedAgg(column='Units delivered',aggfunc='count')).reset_index()