2016-07-18 3 views
2

큰 데이터 프레임 (1 백만 행 이상)이 있습니다. 나는 궁극적으로 두 연령대 사이의 스펙트럼을 보간하려고합니다. 그러나 나는 가장 가까운 값을 찾을 필요가있는 나이의 위아래로 먼저 찾아야합니다.Python/Pandas는 하나의 열에서 위/아래 가장 가까운 값을 찾습니다.

DataFrame 간단하게 내가 할 수있는 방법을 찾기 위해 고군분투이

Age Wavelength Luminosity 
1  
1 
1 
4 
4 
6 
6 
내가 값 4 입력 5 수, 그리고 반환해야

, 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) 

이 값은 하나만 반환하며 둘 다 반환하지 않습니다. 이것이 올바른 길입니까, 아니면 다른 것을해야합니까? 더 좋은 방법이 있습니까?

답변

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 

출력 - Ipython에서

(4, 6) 

Heres는 시간 비교 -

%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

+0

고맙습니다! 완벽하게 일했습니다. – Cmf55

0

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)