Pandas: вычислить сумму значений для каждого уникального элемента ("ID") в заданный период времени, а затем вычислить медиану для всех "ID".
Я работаю над набором данных, содержащим данные о поездках на такси в городе Чикаго. Данные содержат информацию о поездке, такую как, например, идентификатор такси, отметка времени, стоимость проезда и т. Д. Образец данных показан ниже из df.head()
с метками времени в пандах datetime:
Taxi ID Pickup Community Area Trip Total
Trip End Timestamp
2016-04-25 18:00:00 bfec2c659fcbed3b508dc6caaf6f7ef39e17801e8ca0cc... 8.0 16.00
2016-11-16 15:45:00 f45c4bfa9d6c445eb03ab69093f7ec1e9cdecef83cb2ce... 32.0 9.75
2016-01-15 17:45:00 ecfb6f2cdce5d4c4e80218f58070ae719060ee47e648f4... 32.0 14.75
2016-01-20 21:30:00 7d8179131ea9952793af4cda8635e94b56c2b92d3c376c... 32.0 7.25
2016-02-11 09:15:00 d5c4fbae1c0c510364404a90fd477b19f7f03408ce40ff... 35.0 18.75
Предполагая, что у меня есть данные за одну неделю, я хочу добиться этого:
- Рассмотрим выбор биннинга, выбранный пользователем: например, час.
- Сгруппируйте данные по идентификатору такси и суммируйте сумму, внесенную каждым такси за этот час.
- Рассчитайте медиану всех таких "почасовых доходов" между всеми такси в соответствии с идентификатором такси (все еще в течение одного часа).
- Повторите для каждого часа на таймфрейме. За неделю это 24*7 = 168 раз.
- Составьте медиану за час по всем часам недели.
Это может быть расширено до часов в неделю, недель в году и т. Д.
На данный момент я могу использовать pivot_table
скажем, получить средний доход за час дня за весь период (но это не за каждый час недели), или resample
чтобы получить средний тариф за определенное время (но это не "почасовая выручка" такси, это средний тариф за поездку). Ни один из них не достиг бы именно того, чего я хочу, как мне это реализовать?
1 ответ
Я смог добиться этого для моих данных, сначала комбинируя df.grouby
с Grouper
особенность в пандах. Таким образом, данные сначала группируются по идентификатору, и для каждого идентификатора они пересчитываются по таймфрейму (например, час), и, в конце концов, почасовые тарифы для этого конкретного идентификатора могут суммироваться, с помощью этой команды.
dfGrouped = (df.groupby(['Taxi ID', pd.Grouper(freq='H', key='Trip End Timestamp')])
['Trip Total']
.sum()
.unstack(fill_value=0))
Из-за последней операции unstack, dfGrouped
теперь содержит 2D массив Taxi ID против Часа. Медиана всех идентификаторов такси (строк) была просто получена:
dfGrouped.median()