gpt4 book ai didi

python - 按时间间隔合并数据帧的有效方法

转载 作者:行者123 更新时间:2023-12-04 08:10:21 24 4
gpt4 key购买 nike

对于我当前的项目,我需要根据时间间隔合并一些数据帧。这个问题当然有很多答案,例如,我使用了来自 this question 的答案。以前它工作得很好,但它涉及双循环。
当前的问题是这样的。我在这里有一系列类似于 df_1 的 ~500 个数据帧:

                  time     value
42 2020-07-01 00:57:16 0.356310
43 2020-07-01 01:00:20 0.472270
44 2020-07-01 03:33:40 0.356310
45 2020-07-01 03:45:37 0.356310
46 2020-07-01 03:57:51 0.425053
47 2020-07-01 05:29:20 0.340471
他们需要 event从 df_2 加入的列:
                 start                 end  event
49 2020-07-01 03:07:16 2020-07-01 03:09:51 1.0
50 2020-07-01 03:09:51 2020-07-01 03:12:30 1.0
54 2020-07-01 03:21:21 2020-07-01 03:24:46 1.0
58 2020-07-01 03:33:40 2020-07-01 03:36:43 1.0
59 2020-07-01 03:36:43 2020-07-01 03:39:33 1.0
60 2020-07-01 03:39:33 2020-07-01 03:42:57 1.0
万一 df_1.time介于 df_2.start 之间和 df_2.end所以最后我可以得到:
                  time     value      event
42 2020-07-01 00:57:16 0.356310 NaN
43 2020-07-01 01:00:20 0.472270 NaN
44 2020-07-01 03:33:40 0.356310 1.0
45 2020-07-01 03:45:37 0.356310 NaN
46 2020-07-01 03:57:51 0.425053 NaN
47 2020-07-01 05:29:20 0.340471 NaN
问题是,正如我所说,我有大约 500 个类似于 df_1 的数据帧,每个数据帧有超过 10k 条记录,而 df_2 本身的长度大约为 40000 行。所以循环所有的行是不可能的。这将花费大量的时间。
但就我而言,我在 Pandas 中找不到任何可用于该目的的矢量化方法。有任何想法吗?

最佳答案

这是 merge_asof 的好案例, 其中 唯一有效如果全部start , end间隔不重叠。

# match the `time` to the largest `start` earlier than it
tmp = pd.merge_asof(df1,df2, left_on='time',right_on='start')

# check if `time` <= `end`
df1['event'] = tmp['event'].where(tmp['end']>=tmp['time']).values
输出:
                  time     value  event
42 2020-07-01 00:57:16 0.356310 NaN
43 2020-07-01 01:00:20 0.472270 NaN
44 2020-07-01 03:33:40 0.356310 1.0
45 2020-07-01 03:45:37 0.356310 NaN
46 2020-07-01 03:57:51 0.425053 NaN
47 2020-07-01 05:29:20 0.340471 NaN

对于一般情况,我唯一能想到的就是交叉合并和过滤:
(df1.assign(key=1)
.merge(df2.assign(key=1), on='key')
.query('start <= time <= end')
)
这对于您的数据大小应该是可行的,尽管有点慢。

关于python - 按时间间隔合并数据帧的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66003182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com