Как использовать агрегатную функцию на двух столбцах в Pandas, не портя индекс? - PullRequest
1 голос
/ 07 февраля 2020

У меня есть проблема, когда использование agg (['sum', 'count']) выводит "подколонки", а не новые, эксклюзивные столбцы.

Это проблема, потому что мне нужно экспортировать результаты в 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 "подколонок". Конечно, при экспорте в CSV создается «формат», который не читается должным образом чем-либо, кроме pandas.

Как решить эту проблему и почему она происходит? Сначала я подумал, что это произошло из-за конфликта имен, так как у меня было 2 столбца суммы и 2 числа, но я попытался переименовать их, но это не помогло решить проблему.

1 Ответ

1 голос
/ 07 февраля 2020

Вы можете решить эту проблему, используя 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()
...