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

Предполагая, что у меня есть данные за одну неделю, я хочу добиться этого:

  1. Рассмотрим выбор биннинга, выбранный пользователем: например, час.
  2. Сгруппируйте данные по идентификатору такси и суммируйте сумму, внесенную каждым такси за этот час.
  3. Рассчитайте медиану всех таких "почасовых доходов" между всеми такси в соответствии с идентификатором такси (все еще в течение одного часа).
  4. Повторите для каждого часа на таймфрейме. За неделю это 24*7 = 168 раз.
  5. Составьте медиану за час по всем часам недели.

Это может быть расширено до часов в неделю, недель в году и т. Д.

На данный момент я могу использовать 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()
Другие вопросы по тегам