从 Pandas 系列中删除多个密钥

Remove multiple keys from a Pandas series

我有一个 Pandas 系列,想使用要删除的键列表删除多个项目,但此列表包含不属于系列键的元素。

我可以使用下面的命令来做到这一点,但相信一定有更优雅的方法来实现这一点。

series1 = pd.Series({'a':8, 'b':7,'c':6, 'd':5})
list1 = ['b', 'c','e','f']

series1.drop(set(series1.keys()).intersection(set(list1)))

结果:

a    8
d    5
dtype: int64

有什么想法吗?

您可以使用 Index.isin 生成布尔掩码然后将其反转

series1 = series1[~series1.index.isin(list1)]

性能

我很好奇,所以这里是一个小型速度测试,将我的解决方案与 Henry 的解决方案进行比较。当然,这是一个微优化,只有在处理大量数据或多次索引时才值得考虑。

设置

series1 = pd.Series({'a':8, 'b':7,'c':6, 'd':5})
list1 = ['b', 'c','e','f']

n = 100_000
# repeat series1 n times 
s = series1.repeat(n)

>>> s.shape
(400000,)

结果

>>> %timeit s[~s.index.isin(list1)]

15 ms ± 1.79 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit s[s.index.difference(list1)]

75.3 ms ± 8.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

我们可以使用 Index.difference 进行过滤(它执行相同的集合差异,而无需所有 extraction/explicit 转换)。在 Pandas 中,包含掩码往往比独占 masks/dropping 行更快更短:

series1[series1.index.difference(list1)]
a    8
d    5
dtype: int64