如何在Pandas系列中获取最接近零的n个值?

3

如何获取距离 0 最近的 n 个值,类似于使用 nsmallest() 获取 n 个最小值。例如:

series = pd.Series([-1.0,-0.75,-0.5,-0.25,0.25,0.5,0.75,1.0])
series

0   -1.00
1   -0.75
2   -0.50
3   -0.25
4    0.25
5    0.50
6    0.75
7    1.00
dtype: float64

以例如n=4的形式,我想获得以下结果。
0   -0.25
1   0.25
2   -0.50
3   0.50
dtype: float64
2个回答

3
使用locabsnsmallest:
series.loc[series.abs().nsmallest(4).index]

3   -0.25
4    0.25
2   -0.50
5    0.50
dtype: float64

2

如果性能很重要,使用Series.absSeries.argsort获取位置,筛选n并通过Series.iloc进行选择:

n = 4
series = series.iloc[series.abs().argsort()[:n]]
print (series)
3   -0.25
4    0.25
2   -0.50
5    0.50
dtype: float64

最后,如果需要默认索引:
n = 4
series = series.iloc[series.abs().argsort()[:n]].reset_index(drop=True)
print (series)
0   -0.25
1    0.25
2   -0.50
3    0.50
dtype: float64

性能:

series = pd.Series([-1.0,-0.75,-0.5,-0.25,0.25,0.5,0.75,1.0] * 10000)

n = 4000
series = series.iloc[series.abs().argsort()[:n]]
print (series)

In [114]: %timeit series.iloc[series.abs().argsort()[:n]]
794 µs ± 19.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [115]: %timeit series.loc[series.abs().nsmallest(n).index]
2.09 ms ± 34.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

2
我更喜欢Erfan的series.abs().nsmallest(4)方法。 - thinwybk
1
@thinwybk - 好的,只要注意重复索引,那么Erfan的解决方案就会失败。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接