【问题标题】:Python/Pandas find closest value above/below in one ColumnPython/Pandas 在一列中找到高于/低于最接近的值
【发布时间】:2016-07-18 10:06:23
【问题描述】:

我有一个大型数据框(约 100 万行)。我最终将在两个年龄组之间插入光谱。但是,我需要首先找到我需要找到的任何年龄以上和以下的最接近的值。

DataFrame 大致如下所示

 Age   Wavelength   Luminosity
 1     
 1
 1
 4
 4
 6
 6

我需要能够输入 5,并返回值 4 和 6。我正在努力寻找一种方法来做到这一点?这是我尝试过的:

def findnearest(array,value):
    idx = np.searchsorted(array,value, side='left')
    if idx > 125893.0:
        return array[idx]
    else:
        return array[idx]
    idx1 = np.searchsorted(array,value, side='right')
    if idx1 < 2e10:
        return array[idx1]
    else:
        return array [idx1-1]

C = findnearest(m05_010['age'], 5.12e7)

print(C)

这只返回一个值,而不是两个。这是正确的道路还是我应该做一些不同的事情?有没有更好的办法?

【问题讨论】:

    标签: python sorting pandas dataframe astronomy


    【解决方案1】:

    我认为你应该使用bisect,它的速度要快得多,并且仅用于此目的。

    from bisect import *
    arr = np.array([1,1,1,4,4,4,4,4,4,4,6,6])
    
    value = 5
    lower = arr[bisect_left(arr, value) - 1]
    above = arr[bisect_right(arr, value)]
    lower, above
    

    输出 -

    (4, 6)
    

    这是来自 Ipython 的时间比较 -

    %timeit for x in range(100): arr[bisect_left(arr, value)]
    

    输出 -

    10000 次循环,3 次中的最佳:每个循环 92.4 µs

    并使用searchsorted -

    %timeit for x in range(100): arr[np.searchsorted(arr,value,'left')-1]
    

    输出 -

    最慢的运行时间是最快的运行时间的 7.62 倍。这可以
    表示正在缓存中间结果。 10000 个循环,最好的 3:每个循环 142 µs

    【讨论】:

    • 谢谢!完美运行
    • @hashcode55 尝试了 bisect 方法,但不适用于数组 array = np.array([6.379155435759211, 5.952380952380958, 6.805929919137463 ,3.8634321653189487, 2.20125786163521, -0.314465408805071, -1.976639712488791, 8.04132973944295, 10.55705300988321, 12.21922731356695, 14.734950584007205, 3.548966756513936, 3.796046720575037]),无论传入的值如何,它都会返回 (-1.976639712488791, 8.04132973944295)。知道为什么吗?
    【解决方案2】:

    IIUC 并假设输入数组已排序,您可以执行以下操作 -

    above = arr[np.searchsorted(arr,value,'left')-1]
    below = arr[np.searchsorted(arr,value,'right')]
    

    示例运行 -

    案例 1:没有完全匹配的值

    In [17]: arr = np.array([1,1,1,4,4,4,4,4,4,4,6,6])
    
    In [18]: value = 5
    
    In [19]: above = arr[np.searchsorted(arr,value,'left')-1]
        ...: below = arr[np.searchsorted(arr,value,'right')]
        ...: 
    
    In [20]: above, below
    Out[20]: (4, 6)
    

    案例 2:值完全匹配

    In [33]: arr = np.array([1,1,1,4,4,4,4,4,4,4,5,5,5,6,6])
    
    In [34]: value = 5
    
    In [35]: above = arr[np.searchsorted(arr,value,'left')-1]
        ...: below = arr[np.searchsorted(arr,value,'right')]
        ...: 
    
    In [36]: above, below
    Out[36]: (4, 6)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 2021-09-11
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多