【问题标题】:How can I get the n closest to zero values in a pandas Series?如何在熊猫系列中获得最接近零的 n 个值?
【发布时间】:2020-08-07 20:45:41
【问题描述】:

我怎样才能得到最接近0n 值,类似于我用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

【问题讨论】:

    标签: python python-3.x pandas series


    【解决方案1】:

    使用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)
      

      【讨论】:

      • 我更喜欢二凡的series.abs().nsmallest(4)方式。
      • @thinwybk - 好的,只注意重复索引,然后二凡解决方案失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 2021-09-23
      • 2018-09-19
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多