删除行/获取与 Pandas 中大型 DataFrame 不同的子集的最快方法

Ich*_*xgo 6 python dataframe pandas

问题

我正在寻找最快的方法来删除一组已获得索引的行,或者从大型 Pandas DataFrame 中获取这些索引差异的子集(这会产生相同的数据集)。

到目前为止,我有两种解决方案,对我来说似乎相对较慢:

  1. df.loc[df.difference(indices)]

    在我的数据集上大约需要 115 秒

  2. df.drop(indices)

    在我的数据集上大约需要 215 秒

有没有更快的方法来做到这一点?最好是熊猫。

拟议解决方案的性能

  • ~41 秒:df[~df.index.isin(indices)] @jezrael

jez*_*ael 8

我相信您可以创建布尔掩码、反转~和过滤boolean indexing

df1 = df[~df.index.isin(indices)]
Run Code Online (Sandbox Code Playgroud)

正如 @user3471881 提到的,如果您打算df稍后操作过滤器,则需要避免链式索引,添加copy

df1 = df[~df.index.isin(indices)].copy()
Run Code Online (Sandbox Code Playgroud)

此过滤取决于匹配索引的数量以及数据帧的长度。

因此,另一种可能的解决方案是创建array/list索引来保留,然后不需要反转:

df1 = df[df.index.isin(need_indices)]
Run Code Online (Sandbox Code Playgroud)