我有一个函数可以遍历 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()