Python / Pandas在一列中找到高于/低于最接近的值

时间:2016-07-18 10:06:24

标签: python sorting pandas dataframe astronomy

我有一个大数据框(约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)

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

2 个答案:

答案 0 :(得分:2)

我认为你应该使用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

答案 1 :(得分:1)

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)