【发布时间】:2021-09-26 15:06:21
【问题描述】:
我目前有一个如下所示的元组列表:
time_constraints = [
('001', '01/01/2020 10:00 AM', '01/01/2020 11:00 AM'),
('001', '01/03/2020 05:00 AM', '01/03/2020 06:00 AM'),
...
('999', '01/07/2020 07:00 AM', '01/07/2020 08:00 AM')
]
地点:
- 每个元组包含一个
id、lower_bound和upper_bound - 对于给定的
id,没有任何时间范围重叠 -
len(time_constraints)可以是 10^4 到 10^5 的数量级。
我的目标是快速有效地过滤相对较大(数百万行)的 Pandas 数据帧 (df),以仅包含与 id 列匹配且介于指定 lower_bound 和 @987654333 之间的行@次(含)。
我目前的计划是这样做:
import pandas as pd
output = []
for i, lower, upper in time_constraints:
indices = list(df.loc[(df['id'] == i) & (df['timestamp'] >= lower) & (df['timestamp'] <= upper), ].index)
output.extend(indices)
output_df = df.loc[df.index.isin(output), ].copy()
但是,使用 for 循环并不理想。我想知道是否有更好的解决方案(最好是矢量化的)使用 Pandas 或 NumPy 数组更快。
已编辑:
这是df的一些示例行:
| id | timestamp |
|---|---|
| 1 | 01/01/2020 9:56 AM |
| 1 | 01/01/2020 10:32 AM |
| 1 | 01/01/2020 10:36 AM |
| 2 | 01/01/2020 9:42 AM |
| 2 | 01/01/2020 9:57 AM |
| 2 | 01/01/2020 10:02 AM |
【问题讨论】:
标签: python pandas numpy for-loop vectorization