首页 > 解决方案 > 在熊猫中获得超过阈值的第一个记录的最快方法是什么?

问题描述

我想设置一个函数,以便对于一个表中的每一行,我得到比另一个表中的记录更大的最近记录。这些值是日期时间/时间戳。

我做了这个函数,然后我把它打包如下:

重要的提示:

此函数假定数据帧已排序

def get_closest(dt_value, df, column='DateTime', value_column='SampleNumber'):
    filtered_df = df[df[column] >= dt_value][0:1]
    [sample_number] = filtered_df[value_column].values.tolist()
    return sample_number

然后我将它打包如下

def v_get_closest(a, df2):
    return a.apply(lambda x : get_closest(x, df2))

我将应用于更大的 Spark 应用程序中的数十亿行,但这对问题并不重要。

有没有更快的方法来实现这一点?

编辑:表 A

           Datetime     Value
0   2015-01-25 14:14:23  0.911291
1   2015-01-25 12:25:33  0.396191
2   2015-01-25 14:48:00  0.040370
3   2015-01-25 22:56:34  0.422482
4   2015-01-25 09:11:09  0.314022
5   2015-01-25 17:38:26  0.969917
6   2015-01-25 01:53:39  0.508699
7   2015-01-25 15:58:50  0.972176
8   2015-01-25 16:49:45  0.112304
9   2015-01-25 07:02:37  0.950211
10  2015-01-25 01:50:14  0.729004
11  2015-01-25 08:15:49  0.828108
12  2015-01-25 21:03:15  0.842581
13  2015-01-25 03:31:36  0.694799
14  2015-01-25 05:37:49  0.521695
15  2015-01-25 13:21:42  0.150373
16  2009-01-25 01:12:00  0.502133

表 B

              DateTime  Key
1  2010-10-13 18:32:00    2
2  2016-05-13 01:12:03    1  

用法:

#returns the column
v_get_closest(A['datetime'] , B)

预期的:

           Datetime     Value      Key
0   2015-01-25 14:14:23  0.911291    1
1   2015-01-25 12:25:33  0.396191    1
2   2015-01-25 14:48:00  0.040370    1
3   2015-01-25 22:56:34  0.422482    1
4   2015-01-25 09:11:09  0.314022    1
5   2015-01-25 17:38:26  0.969917    1
6   2015-01-25 01:53:39  0.508699    1
7   2015-01-25 15:58:50  0.972176    1
8   2015-01-25 16:49:45  0.112304    1
9   2015-01-25 07:02:37  0.950211    1
10  2015-01-25 01:50:14  0.729004    1
11  2015-01-25 08:15:49  0.828108    1
12  2015-01-25 21:03:15  0.842581    1
13  2015-01-25 03:31:36  0.694799    1
14  2015-01-25 05:37:49  0.521695    1
15  2015-01-25 13:21:42  0.150373    1
16  2009-01-25 01:12:00  0.502133    2

标签: pythonpandas

解决方案


2009 行在预期结果中的作用在哪里?对我来说,这看起来可以用 pd.merge_asof 解决。

df = pd.merge_asof(df1.sort_values(by='DateTime'),
                   df2.sort_values(by='DateTime'),
                   on='DateTime'
                   direction='forward') 

推荐阅读