2017-11-26 4 views
0

Python에서는 팬더 데이터 프레임이 있습니다. 열 A의 한 값을 필터링하려고합니다.Python Pandas 데이터 프레임 : 가장 큰 값을보다 작게 가져옵니다.

A이 '1', '2', '4', '7'값을 갖는 경우 열 A이 '5'보다 작은 가장 높은 값인 행을 찾고 있습니다. '4'여야 함). 또 다른 조건이 존재합니다.

다음 진술은 작동하지 않습니다.

작동하도록 최대 상태와 관련하여 어떻게 변경해야합니까?

df_new = df[(df['some_other_column'] < XYZ) & max(df['A'] <= '5')] 

답변

2

사용 np.searchsorted -

df 

    x 
0 1 
1 2 
2 4 
3 7 

df.iloc[(np.searchsorted(df.x.values, 5) - 1).clip(0)] 

    x 
2 4 

타이밍

df = pd.DataFrame({'x' : np.arange(100000)}) 
%%timeit 
x = df.x 
g = x[x <= 12345].max() 
df[x == g] 

1000 loops, best of 3: 1.27 ms per loop 
%timeit df.iloc[(np.searchsorted(df.x.values, 12345) - 1).clip(0)] 
10000 loops, best of 3: 139 µs per loop 

비교가 없습니다. searchsorted을 사용하면 훨씬 빠릅니다.

+0

정렬되는 열의 가정을 사용하지 않습니까? –

+0

사실. 그러나 "분류기"인수로 함수에 argsorted 인덱스를 전달하면 최소한의 문제 만 해결할 수 있습니다. –

+0

또한 한 행을 반환하므로 바람직하지 않을 수 있습니다. 또한 당신은 분류기로 답변을 업데이 트하고 생성 부분에 x 열에'np.random.permutation'을 추가 할 수 있습니다, 나는 색인이 값과 정확히 동일 할 때이 비트를 최적화하는 방법에 대해 궁금합니다. –

1

다른 조건은 기본 질문과 관련이 없으므로 무시하겠습니다.

In [1]: import pandas as pd 
    ...: df = pd.DataFrame({'x': [1, 2, 4, 7]}) 
    ...: x = df['x'] 
    ...: greatest_smaller_than_5 = x[x <= 5].max() 
    ...: df[df['x'] == greatest_smaller_than_5] 
    ...: 
Out[1]: 
    x 
2 4 

추신 : - 다음

트릭 (가난한 변수 명명 사면을) 수행 귀하의 질문에 그것은 smaller than라고 말하지만 귀하의 코드는 smaller or equal to을 제안합니다.

+0

이 답변은 성능면에서 차선책입니다. searchsorted를 사용하여 내 대답보기. –

관련 문제