【发布时间】:2021-05-20 01:55:45
【问题描述】:
我有两个数据框:x 和 y。我的目标是在 x 上加入 y,其中 x.timestamp 介于 y min 和 max 之间(并计算这些出现次数)。
x.shape
(69593, 1)
x.head()
timestamp count
4 2013-06-01 04:12:34 0
5 2013-06-01 04:19:08 0
6 2013-06-01 05:18:35 0
7 2013-06-01 06:00:19 0
8 2013-06-01 09:16:13 0
y.head()
min max
0 2013-06-02 09:10:51 2013-06-02 10:27:44
1 2013-06-12 03:08:35 2013-06-12 03:08:35
2 2013-08-03 09:11:35 2021-01-26 23:05:17
y.shape
(3, 2)
在这种情况下,对每一行使用 lambda 函数是可行的,但速度非常慢(将 3 行的表连接到约 70k 行的表需要 45 到 60 秒)。
%%time
x['count'] = \
x.apply(lambda r: len(y.loc[(y['min']<=r['timestamp']) & (y['max']>=r['timestamp'])]), axis=1)
numpy 中是否有一种方法可以对该连接进行矢量化,或者是否有其他建议可以使该连接运行得更快(5 秒以下)?
【问题讨论】:
标签: python pandas numpy join vectorization