熊猫:将datetime列与另一个数据框连接(性能)

时间:2020-10-10 09:54:56

标签: pandas performance

我有一个带有10个日期时间列(main_df)的DataFrame d_0 ... d_9。对于某些行,我的日期少于10个,因此我用d0 .. d_X填充了NaT

        id                 d_0                 d_1                 d_2                 d_3                d_4                  d_5                 d_6                 d_7                 d_8                d_9
530124   4 2019-05-20 13:49:24 2019-05-29 11:06:30 2019-06-11 19:04:40 2019-06-18 19:40:37 2019-07-09 10:17:05 2019-07-18 17:39:30 2019-08-02 12:35:13 2019-08-13 10:09:59 2019-08-17 16:38:45 2019-08-26 12:07:28
627023   8                 NaT                 NaT                 NaT 2018-01-03 17:14:42 2018-01-15 16:40:22 2018-01-18 17:28:03 2018-04-23 12:00:27 2018-05-24 17:49:01 2018-06-07 16:41:15 2018-07-22 15:22:48
470303   6                 NaT                 NaT                 NaT                 NaT                 NaT                 NaT 2017-06-19 14:23:57 2017-10-04 14:25:21 2017-10-11 15:38:28 2017-12-28 18:39:00

我还有一个字典(date_dfs),它将id的每个值映射到一个保存所有日期的值的DataFrame。所有这些数据框都有一个DatetimeIndex和3列,其中包含每个可能日期的值。我的目标是在main_df和相应的date_df之间进行联接。因此,对于main_df中的特定行,我想要一个(10,3)形状数组。我想对main_df中的每一行执行此操作,以获得(n, 10, 3)形状的n = len(main_df)形状数组。

当前,我正在逐行执行此操作,由于我的main_df大约有50万行,因此需要很长时间。到目前为止,我的代码是这样的:

dt_cols = [f'd_{i}' for i in range(10)]
result = []

for seq_idx in range(len(main_df)):
    seq = main_df.iloc[seq_idx]
    seq_dt_cols = seq[dt_cols]

    # Necessary because `seq_dt_cols` has type `object`
    date_series = pd.to_datetime(seq_dt_cols[seq.pad_end:], infer_datetime_format=True)
    seq_dates = date_series.dt.date - pd.DateOffset(1)

    # pad missing values with -1
    pad = np.full(shape=(seq.pad_end, 3), fill_value=-1, dtype=np.float32)

    date_vals = self.date_dfs[seq.id].loc[seq_dates].values.astype(np.float32)
    result.append(np.concatenate((pad, date_vals)))

return np.stack(result)

我认为每行对pd.to_datetime的调用是造成如此缓慢的很大原因,但我必须这样做,因为Pandas不会将系列转换为datetime,甚至尽管所有列的类型均为datetime

我可以以某种方式使其更快吗?

0 个答案:

没有答案