有没有一种方法可以有效地将函数应用于 Pandas 列中的 300 万个值?

Is there a way to efficiently apply a function to 3 million values in a Pandas column?

我目前正在学习一门关于如何赢得数据科学竞赛的数据科学课程。期末项目是我们不得不参加的Kaggle竞赛

我的训练数据集有近 300 万行,其中一列是“购买日期”列。

我想计算每个日期到最近的 public 假期的距离。

例如如果日期是 31/12/2014,则最近的 PH 将是 01/01/2015。相隔的天数将是“1”。

我想不出执行此操作的有效方法。我有一个包含多个时间戳的列表,每个时间戳都是俄罗斯的 public 假期(数据集来自俄罗斯)。

def dateDifference (target_date_raw):
    abs_deltas_from_target_date = np.subtract(russian_public_holidays, target_date_raw)
    abs_deltas_from_target_date = [i.days for i in abs_deltas_from_target_date if i.days >= 0]
    index_of_min_delta_from_target_date = np.min(abs_deltas_from_target_date)
    return index_of_min_delta_from_target_date

其中 'russian_public_holidays' 是 public 假期日期的列表,'target_date_raw' 是我要计算到最近的 public 假期的距离的日期。

这是我用来在 DataFrame 中为不同日期创建新列的代码。

training_data['closest_public_holiday'] = [dateDifference(i) for i in training_data['date']]

这段代码 运行 将近 25 分钟,没有显示完成的迹象,这就是为什么我向你们求助的原因。

我知道这可能是最不可能的 Pandorable 做事方式,但在我的研究过程中我无法真正找到一种对单个列进行操作的干净方式。我看到很多人说在单个列上使用“应用”功能是一种糟糕的做事方式。我对使用如此大的数据集还很陌生,这就是为什么干净高效的做法现在似乎让我望而却步。请告诉我解决此问题的最佳方法!

试试这个,看看是否有助于计时。我担心它会占用太多内存。我没有数据可以测试。你可以试试

df = pd.DataFrame(pd.date_range('01/01/2021','12/31/2021',freq='M'),columns=['Date'])
holidays = pd.to_datetime(np.array(['1/1/2021','12/25/2021','8/9/2021'])).to_numpy()

假设假期:1/1/2021、8/9/2021、12/25/2021

df['Days Away'] = ( 
    np.min(np.absolute(df.Date.to_numpy()
        .reshape(-1,1) - holidays),axis=1) / 
        np.timedelta64(1, 'D') 
    )