从 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
我有一个 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