从 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_starts
和 drop_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)]
我有一个大型数据框,我已从中确定了要删除的索引范围。
为了识别正确的行,我有一个看起来有点像这样的数组:
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_starts
和 drop_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)]