#pandas #sum #grouping #dtype
#pandas #сумма #группировка #dtype
Вопрос:
Думал, что это будет несколько просто, но опять же — не тот случай — для меня.
Я создал groupby и сохранил как фрейм данных. Теперь я хочу выполнить groupby для этого фрейма данных, но у меня возникают ошибки каждый раз, когда я пытаюсь выполнить подсчет столбцов, которые были суммированы в предыдущем groupby. Ниже приведен фрейм данных из первого groupby:
<class 'pandas.core.frame.DataFrame'>
employee int64
Date1 datetime64[ns]
Duration sum float64
RoundedInMinutes sum int64
RoundedOutMinutes sum int64
Я могу выполнить group by для сотрудника и даже лямбда-функцию, используя Date1. Однако я не могу выполнить лямбда-функцию для длительности. Существует ключевая ошибка в продолжительности. Любой из столбцов с суммой в dtype создает ошибку.
Код для создания первого groupby:
groupedByEmployeeShift = df.groupby(['employee', 'Date1']).agg({'Duration': ['sum'], 'RoundedInMinutes': ['sum'], 'RoundedOutMinutes': ['sum']}).reset_index()
Результат:
employee Date1 Duration RoundedInMinutes RoundedOutMinutes
sum sum sum
0 102209 2015-06-27 5.87 0 0
1 102209 2015-07-23 8.17 0 0
2 102209 2015-08-15 8.00 0 0
3 102209 2016-01-30 8.23 2 0
4 102209 2016-08-13 8.25 4 0
5 102209 2017-01-28 8.00 1 0
6 102209 2017-08-19 8.02 5 0
7 102209 2018-02-10 8.00 2 0
8 102209 2018-08-18 8.10 0 0
9 102209 2019-02-09 7.93 1 0
Код для запуска с этим фреймом данных groupby:
shiftStats=groupedByEmployeeShift.groupby('employee')['Duration'].apply(lambda x: (x> 0).sum()).reset_index(name='OT_Shifts')
Я знаю, что это что-то простое, но я просто не могу понять это.
Мы очень ценим вашу помощь.
Комментарии:
1. Можете ли вы удалить мультииндекс и попробовать groupby после.
groupedByEmployeeShift.columns = groupedByEmployeeShift.columns.droplevel(0)
2. Почему бы и нет
groupedByEmployeeShift.loc[ groupedByEmployeeShift['Duration'].gt(0) ].groupby('employee')['Duration'].sum()
?3. Вы действительно должны опубликовать ожидаемый результат, я предположил, что вам нужна та сумма, которую я прокомментировал, но ваш вопрос неясен
Ответ №1:
Боже. Неочевидно, но легко исправить. «Сумма» находится во второй строке заголовка фрейма данных. Просто использовал приведенный ниже код, чтобы удалить его, и теперь все работает.
groupedByEmployeeShift.columns = groupedByEmployeeShift.columns.droplevel(-1)