我有两个数据帧. DF1:

                   Date     High      Mid      Low
1   2023-08-03 00:00:00  29249.8  29136.6  29152.3
4   2023-08-03 12:00:00  29395.8  29228.1  29105.0
10  2023-08-04 12:00:00  29305.2  29250.1  29137.1
13  2023-08-05 00:00:00  29099.9  29045.3  29073.0
18  2023-08-05 20:00:00  29061.6  29047.1  29044.0
..                  ...      ...      ...      ...
696 2023-11-26 20:00:00  37732.1  37469.9  37370.0
703 2023-11-28 00:00:00  37341.4  37138.2  37254.1
707 2023-11-28 16:00:00  38390.7  38137.2  37534.4
711 2023-11-29 08:00:00  38419.0  38136.3  38112.0
716 2023-11-30 04:00:00  38148.9  37800.1  38040.0

和df2:

                Start      Top   Bottom
0 2023-11-28 00:00:00  37341.4  37138.2
1 2023-11-24 12:00:00  38432.9  37894.4

我需要判断第一个数据帧中的值是否落在第二个数据帧的一行中的值的范围内,并将匹配的数量存储在一列中.我可以像这样使用迭代来完成:

for idx in df1.index:

    df2.loc[
        (df2.Start !=  df1.at[idx, 'Date']) &
        (df2.Bottom < df1.at[idx, 'High']) &
        (df2.Top > df1.loc[idx, ['Mid', 'Low']].max()),
        'Match'] += 1

但这条路走得很慢.有没有一种更快的方法来做到这一点而无需迭代?

推荐答案

如果您有足够的内存(取决于df1df2),您可以使用cross merge:

df2['Match'] = (df2.reset_index()
                   .merge(df1, how='cross')
                   .loc[lambda x:
                        (x.Start !=  x.Date) &
                        (x.Bottom < x.High) &
                        (x.Top > x[['Mid', 'Low']].max(axis=1))]
                   .value_counts('index').reindex(df2.index, fill_value=0))

输出:

>>> df2
                Start      Top   Bottom  Match
0 2023-11-28 00:00:00  37341.4  37138.2      0
1 2023-11-24 12:00:00  38432.9  37894.4      3

Python相关问答推荐

如何最好地处理严重级联的json

重命名变量并使用载体中的字符串存储 Select 该变量

如何在Pandas 中存储二进制数?

在Python中根据id填写年份系列

PyTorch卷积自动编码器,输出维度与输入不同

Pandas 群内滚动总和

即使在可见的情况下也不相互作用

替换字符串中的多个重叠子字符串

如何比较numPy数组中的两个图像以获取它们不同的像素

如何让剧作家等待Python中出现特定cookie(然后返回它)?

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

Python库:可选地支持numpy类型,而不依赖于numpy

将pandas Dataframe转换为3D numpy矩阵

ODE集成中如何终止solve_ivp的无限运行

有没有一种方法可以从python的pussompy比较结果中提取文本?

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

名为__main__. py的Python模块在导入时不运行'

pandas:对多级列框架的列进行排序/重新排序

在输入行运行时停止代码

在Admin中显示从ManyToMany通过模型的筛选结果