Пример кадра данных
> 0 location_day payType Name ratePay elapsedSeconds
> 1 2019-12-10 PRE Amy 12.25 199
> 2 2019-12-12 PRE Amy 12.25 7
> 3 2019-12-17 PRE Amy 12.25 68
> 4 2019-12-17 RP Amy 8.75 62
Для каждого дня суммируйте elapsedSeconds и вычисляйте новый столбец с общей суммой toPay (elapsedSeconds * ratePay), но применяйте «cap» elapsedSeconds, равное 120. Для любого одного дня, который имеет только 1 payType, примените кепку так, чтобы только 120 использовалось, чтобы вычислить "toPay" col.
Но ...
Кроме того, groupby payType, чтобы при наличии двух уникальных "payTypes" в один день, суммируйте elapsedSeconds, чтобы определить, превышает ли он ограничение (120), и если Итак, вычтите elapsedSeconds из последнего payType, чтобы сделать сумму равной 120.
Поэтому я хочу получить такой вывод:
> 0 location_day payType Name ratePay elapsedSeconds
> 1 2019-12-10 PRE Amy 12.25 120
> 2 2019-12-12 PRE Amy 12.25 7
> 3 2019-12-17 PRE Amy 12.25 68
> 4 2019-12-17 RP Amy 8.75 52
Я не совсем уверен, как подойти к этому и на самом деле только выполнили некоторые очень базовые c группировку и тестирование вычисления новых столбцов с условными выражениями, такими как
finDfcalc1 = finDf.sort('location_day').groupby(flds)['elapsedSeconds'].sum().reset_index()
finDfcalc1.loc[finDfcalc1['elapsedSeconds'] < 120, 'elapsedSecondsOverage'] = finDfcalc1['elapsedSeconds'] * 1
finDfcalc1.loc[finDfcalc1['elapsedSeconds'] > 120, 'elapsedSecondsOverage'] = finDfcalc1['elapsedSeconds'] - 120
finDfcalc1['toPay'] = finDfcalc1['ratePay'] * finDfcalc1['elapsedSecondsOverage']
Все это не должно быть однострочным и было бы прекрасно, если бы вы работали логи c. Все предложения и идеи с благодарностью.