如何在 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.0
和 python 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()
我遇到这个问题,使用 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.0
和 python 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()