如何在不循环的情况下遍历两个数据帧以在第二个数据帧上找到最接近的值

时间:2020-12-21 14:55:28

标签: python pandas dataframe

我有一个函数可以遍历 3 个数据帧,并根据在第二个和第三个数据帧上找到的最接近的值创建 20 个新列,并且这些表有大约 20000 行。我已经得到了使用原始循环的代码,但我知道这是最低效的方法。但是,我一直无法弄清楚以 Pandas 的方式执行此操作的方法(我需要使用“分配”吗?)。

如何使以下(简化的)代码尽可能快并消除循环?当表超过 10000 行时需要 10 多分钟,我需要从 20 个不同的列中查找值。

import pandas as pd


def find_closest_size():
    df = pd.DataFrame(data={'datetime': ["2019-10-03T08:23:30-06:00", "2019-10-03T08:23:35-06:00", 
                                         "2019-10-03T08:24:04-06:00", "2019-10-03T08:24:33-06:00", 
                                         "2019-10-03T08:29:23-06:00", "2019-10-03T09:06:20-06:00", 
                                         "2019-10-03T09:10:24-06:00", "2019-10-03T09:18:40-06:00", 
                                         "2019-10-03T09:19:04-06:00", ]})
    df['datetime'] = pd.to_datetime(df['datetime'])
    df['datetime'] = df['datetime'].dt.tz_localize(None)

    df2 = pd.DataFrame(data={'datetime': ["10/2/2019 0:00", "10/3/2019 0:00", "10/3/2019 2:30", 
                                          "10/4/2019 0:00", "10/5/2019 0:00"], 
                             'size': [12.25, 12.25, 12.25, 12.25, 12.25]})

    df2['datetime'] = pd.to_datetime(df2['datetime'])

    i = df['datetime'].index[0]
    while i <= df['datetime'].index[-1]:
        df.loc[i, 'Hole Size'] = round(float(df2[df2['datetime'] == min(df2['datetime'], key=lambda 
                                       x: abs(x - df.loc[i, 'datetime']))]['size'].tolist()[0]), 3)
        i += 1

    print(df)


find_closest_size()

0 个答案:

没有答案
相关问题