从 pandas 数据帧中删除多行的算法效率

Algorithmic efficiency of dropping a multitude of rows from a pandas dataframe

我有一个大型数据框,我已从中确定了要删除的索引范围。

为了识别正确的行,我有一个看起来有点像这样的数组:

drop_pairs = [
["2020-01-01 10:00:00","2020-01-03 13:00:00"],
["2020-01-13 11:00:00","2020-01-13 13:33:00"],
["2020-01-22 00:07:00","2020-01-22 22:22:00"],
...]

我正在尝试根据此数组删除我的数据框中的行:

for timerange in drop_pairs:
    df = df.drop(df.loc[f"{timerange[0]}":f"{timerange[1]}"].index)

但是对于大型数据帧,这种方法确实非常慢。 我怎样才能提高效率?

正如评论中所暗示的,这也可以使用布尔数组来完成。我已将数组 drop_pairs 转换为两个数组 drop_startsdrop_ends 以及要删除的时间范围的相应开始和结束值。

接下来,我创建了蒙版:

mask_starts = df.index.isin(drop_starts).astype(int)
mask_ends = df.index.isin(drop_ends).astype(int) * -1

这样 mask_starts + mask_ends 就会给出一个数组,其长度为我的 df 的长度,在要删除的时间范围开始处为 1s,在结束处为 -1s,在其他任何地方为 0s。

我使用 np.cumsum 随后将所有要删除的时间戳标记为 1,将其他所有内容标记为 0。

drop_mask = np.cumsum(mask_starts + mask_ends)

基于这个掩码,很容易去掉相关范围:

df = df[~drop_mask.astype(bool)]