2016-09-28 3 views
1

나는 이것을 좀 더 pythonic하게하려고합니다.더 쓸쓸한 방법이 있나요?

user_df[-1:]['status_id'].values[0] in {3,5} 

나는 수동으로 user_id.ix[-1:, 'status_id'].isin([3,5])을 시도했지만 작동하지 않았습니다.

제안 사항? 최상위 버전이 작동하지만 약간 이상하게 보입니다.

답변

4

당신이 시도 할 수 :

user_id['status_id'].iloc[-1:].isin([3,5]) 

샘플 :

user_id = pd.DataFrame({'status_id':[1,2,3]}) 
print (user_id) 
    status_id 
0   1 
1   2 
2   3 

#iloc without : [-1] return scalar 
print (user_id['status_id'].iloc[-1] in set({3,5})) 
True 

#iloc with : [-1:] return vector - Series 
print (user_id['status_id'].iloc[-1:].isin([3,5])) 
2 True 
Name: status_id, dtype: bool 
+0

아주 좋은 대답. 특히 그가 정말로 팬더를 'isin'이라고 쓰고 싶다면 (질문에 나온대로) –

+0

예, 좋은 대답입니다. 나는 일관성을 유지하기 위해'user_id [ 'status_id'] .iloc [-1] .isin ([3,5])'를 선택했다. 고맙습니다! –

+0

@FranciscoCervera - 감사합니다! – jezrael

2

isin이 소폭 빠른 수 있습니다 (당신이 더 속도를 확인해야 더 값까지 당신은 알 것입니다 ...하지만도 큰 세트가 큰 차이가 없을 것입니다 ... (나는이 예제에서 더 빠를 것입니다 ... 아마도 조금 더 느릴 것입니다 ...) 그러나 val in set()은 꽤 평범한 pythonic입니다. pd.isin)

당신이 pandas.isin 또는를 사용하여 set ...에 대해 단일 값을 테스트 numpy.in1d 당신은 C로 이동하려면 상당한 시간 오버 헤드를 incure하고 다시 파이썬으로 단지 in를 사용하여 대와 세트 느릅 나무는 O(1)입니다 look up ... (두 경우 모두 타임 슬라이스가 인간 시간 스케일에 존재하지 않는다.)

+0

또한 팬더 함수'NaN'을 매우 잘 처리합니다. – jezrael

+0

하지만이 문제 도메인에 적용되는 것은 아닙니다. 그는 ** 하나의 값 **을 테스트하고 있습니다. NaN은 그 세트에 없습니다. –

+0

생각합니다. 일반적으로 팬더 함수 대 파이썬 함수. 그러나 이런 식으로 당신이 옳습니다. – jezrael

관련 문제