Pandas:计算给定时间范围内每个唯一元素 ('ID') 的值总和,然后计算所有 'ID' 的中位数
Pandas: Compute sum of values for each unique element ('ID') in a given timeframe and then compute the median across all 'ID's
我正在处理一个包含芝加哥市出租车数据的数据集。数据包含每次行程的信息,例如出租车 ID、时间戳、票价等。下面显示了来自 df.head()
的数据示例,时间戳在 pandas 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
假设我有一个星期的数据,我想实现这个:
- 考虑用户选择的装箱选项:例如:小时。
- 按出租车ID对数据进行分组,并汇总每辆出租车在一小时内赚取的金额。
- 根据出租车 ID 计算所有此类 'hourly revenues' 出租车之间的中位数(仍在该一小时内)。
- 在时间范围内的每个小时重复一次。一个星期,就是24*7 = 168次。
- 绘制一周中所有小时的每小时中位数。
这可以扩展到一周几个小时,一年几个星期等等。
截至目前,我可以使用 pivot_table
来获取整个时间范围内一天中每小时的收入中位数(但这不是一周中的每个小时),或者resample
以获得随时间变化的中位车费(但这不是 'hourly revenue' 的士,这是每次行程的中位车费)。这些都不能完全达到我想要的效果,我应该如何实现?
我能够通过首先将 df.grouby
与 pandas 中的 Grouper
功能相结合来实现我的数据。因此,数据首先按 ID 分组,对于每个 ID,按时间范围(例如小时)重新采样,最终可以通过此命令汇总该特定 ID 的每小时票价。
dfGrouped = (df.groupby(['Taxi ID', pd.Grouper(freq='H', key='Trip End Timestamp')])
['Trip Total']
.sum()
.unstack(fill_value=0))
由于最后的拆栈操作,dfGrouped
现在包含出租车 ID 与小时的二维数组。所有出租车 ID(行)的中位数简单地通过以下方式获得:
dfGrouped.median()
我正在处理一个包含芝加哥市出租车数据的数据集。数据包含每次行程的信息,例如出租车 ID、时间戳、票价等。下面显示了来自 df.head()
的数据示例,时间戳在 pandas 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
假设我有一个星期的数据,我想实现这个:
- 考虑用户选择的装箱选项:例如:小时。
- 按出租车ID对数据进行分组,并汇总每辆出租车在一小时内赚取的金额。
- 根据出租车 ID 计算所有此类 'hourly revenues' 出租车之间的中位数(仍在该一小时内)。
- 在时间范围内的每个小时重复一次。一个星期,就是24*7 = 168次。
- 绘制一周中所有小时的每小时中位数。
这可以扩展到一周几个小时,一年几个星期等等。
截至目前,我可以使用 pivot_table
来获取整个时间范围内一天中每小时的收入中位数(但这不是一周中的每个小时),或者resample
以获得随时间变化的中位车费(但这不是 'hourly revenue' 的士,这是每次行程的中位车费)。这些都不能完全达到我想要的效果,我应该如何实现?
我能够通过首先将 df.grouby
与 pandas 中的 Grouper
功能相结合来实现我的数据。因此,数据首先按 ID 分组,对于每个 ID,按时间范围(例如小时)重新采样,最终可以通过此命令汇总该特定 ID 的每小时票价。
dfGrouped = (df.groupby(['Taxi ID', pd.Grouper(freq='H', key='Trip End Timestamp')])
['Trip Total']
.sum()
.unstack(fill_value=0))
由于最后的拆栈操作,dfGrouped
现在包含出租车 ID 与小时的二维数组。所有出租车 ID(行)的中位数简单地通过以下方式获得:
dfGrouped.median()