2016-07-09 5 views
3

저는 파이썬과이 커뮤니티에 상당히 익숙합니다. 그래서 아마추어적인 시도를 용서해주십시오. 아마도 내게 혼란 스러울 정도의 혼란을 설명 할 수 있습니다. 어쨌든 ...xs를 통해 분할하는 동안 multiIndex DataFrame에서 any() 및 all()을 사용합니다. 이상한 동작입니까?

"데이터"라는 데이터 프레임이 있습니다. 그것은 "날짜"와 "방귀"로 구성된 2 단계로 multiIndexed입니다.

"integrated_daily_difference"라는 단일 열이 있습니다. 당신은 "방귀"를 가정 할 수

유형이다 : 'pandas.core.index.Index'를 통해 만들어진 : farts = data.index.levels[1]

가 지금은 임의의 나의 dataframe의 조각보기를 가지고 싶습니다 상상 할 수 있습니다 방귀의 인덱스 값 : 즉, 방귀 [1]

나 :

data.xs(farts[1], level = 1) 

컴퓨터 :

    integrated_daily_difference 
     date  
2015-05-21 00:00:00+00:00 0.000000 
2015-05-22 00:00:00+00:00 0.000000 
2015-05-26 00:00:00+00:00 -0.024497 
2015-05-27 00:00:00+00:00 -0.051144 
2015-05-28 00:00:00+00:00 -0.079841 
2015-05-29 00:00:00+00:00 -0.106666 
2015-06-01 00:00:00+00:00 -0.131245 
2015-06-02 00:00:00+00:00 -0.157428 
2015-06-03 00:00:00+00:00 -0.184057 
2015-06-04 00:00:00+00:00 -0.209755 
2015-06-05 00:00:00+00:00 -0.234588 
2015-06-08 00:00:00+00:00 -0.262365 
2015-06-09 00:00:00+00:00 -0.291890 
2015-06-10 00:00:00+00:00 -0.320943 
2015-06-11 00:00:00+00:00 -0.352627 
2015-06-12 00:00:00+00:00 -0.381425 
2015-06-15 00:00:00+00:00 -0.404055 

나 :

data.xs(farts[1], level = 1) < 0 

컴퓨터 :

   integrated_daily_difference 
     date 
2015-05-21 00:00:00+00:00 False 
2015-05-22 00:00:00+00:00 False 
2015-05-26 00:00:00+00:00 True 
2015-05-27 00:00:00+00:00 True 
2015-05-28 00:00:00+00:00 True 
2015-05-29 00:00:00+00:00 True 
2015-06-01 00:00:00+00:00 True 
2015-06-02 00:00:00+00:00 True 
2015-06-03 00:00:00+00:00 True 
2015-06-04 00:00:00+00:00 True 
2015-06-05 00:00:00+00:00 True 
2015-06-08 00:00:00+00:00 True 
2015-06-09 00:00:00+00:00 True 
2015-06-10 00:00:00+00:00 True 
2015-06-11 00:00:00+00:00 True 
2015-06-12 00:00:00+00:00 True 
2015-06-15 00:00:00+00:00 True 

나는이 결과가 사실 그래서 값이 내 슬라이스 dataframe 내에서 어떤 위치에 존재하는지 여부를 반환 가정?

나 :

data.xs(farts[1], level = 1).any() 

컴퓨터 :

integrated_daily_difference True 
dtype: bool 

OK,이 모든 종류의 의미가 있습니다. 이제 이상한 물건에 대한 ..

나 :

data.xs(farts[1], level = 1).any() < 0 

컴퓨터 :

integrated_daily_difference False 
dtype: bool 

허 ....?

나 :

data.xs(farts[1], level = 1).any(axis = 0) < 0 

컴퓨터 :

integrated_daily_difference False 
dtype: bool 

나 :

data.xs(farts[1], level = 1).any(axis = 1) < 0 

컴퓨터 :

 date 
2015-05-21 00:00:00+00:00 False 
2015-05-22 00:00:00+00:00 False 
2015-05-26 00:00:00+00:00 False 
2015-05-27 00:00:00+00:00 False 
2015-05-28 00:00:00+00:00 False 
2015-05-29 00:00:00+00:00 False 
2015-06-01 00:00:00+00:00 False 
2015-06-02 00:00:00+00:00 False 
2015-06-03 00:00:00+00:00 False 
2015-06-04 00:00:00+00:00 False 
2015-06-05 00:00:00+00:00 False 
2015-06-08 00:00:00+00:00 False 
2015-06-09 00:00:00+00:00 False 
2015-06-10 00:00:00+00:00 False 
2015-06-11 00:00:00+00:00 False 
2015-06-12 00:00:00+00:00 False 
2015-06-15 00:00:00+00:00 False 
,363,210

나이 :

data.xs(farts[1], level = 1).any(axis = 1) <= 0 

은 컴퓨터 :

 date 
2015-05-21 00:00:00+00:00  True 
2015-05-22 00:00:00+00:00  True 
2015-05-26 00:00:00+00:00 False 
2015-05-27 00:00:00+00:00 False 
2015-05-28 00:00:00+00:00 False 
2015-05-29 00:00:00+00:00 False 
2015-06-01 00:00:00+00:00 False 
2015-06-02 00:00:00+00:00 False 
2015-06-03 00:00:00+00:00 False 
2015-06-04 00:00:00+00:00 False 
2015-06-05 00:00:00+00:00 False 
2015-06-08 00:00:00+00:00 False 
2015-06-09 00:00:00+00:00 False 
2015-06-10 00:00:00+00:00 False 
2015-06-11 00:00:00+00:00 False 
2015-06-12 00:00:00+00:00 False 
2015-06-15 00:00:00+00:00 False 

나 :

data.xs(farts[1], level = 1).any(axis = 0) <= 0 

은 컴퓨터 :

integrated_daily_difference False 
dtype: bool 

그런 다음 내 컴퓨터는 미친 듯이 웃기 시작 나와 머리가 폭발했습니다 ...

그러나 더 심각하게, 여기서 무슨 일이 일어나고 있습니까? 내 목표는 단일 열 데이터 프레임의 모든 값 또는 모든 값이 조건을 충족하는지 확인하고 True 또는 False 값을 반환하는 것입니다. 나는 어떤 것을 제대로 사용하지 않는 것 같아서 도움을 구하고있다.

모든 의견을 환영합니다. 미리 감사드립니다.

답변

2

먼저 나를 정의 할 어떤 수단

축 요청을 통해 모든 요소는 당신이 연락 해주기 할 때 사실 여부 pandas-

반환의 설명서에 따라 -

data.xs(farts[1], level = 1).any() 

그냥 어떤 값이 진실인지 여부를 확인합니다. 조건이 없으므로 이지만입니다. ven은 0을 False로, 다른 모든 숫자를 True로 간주하는 숫자를 확인합니다. 이제 으로 숫자가 0 인 경우 True를 반환합니다.

data.xs(farts[1], level = 1).any() < 0 

을하지만 사실은 1이고 거짓 data.xs(farts[1], level = 1).any()에 출력이 True로 1. 그래서 당신은

을 확인 있을지 인 false를 반환하므로 정수로 표현하면 0 - 이제

당신은 확인

data.xs(farts[1], level = 1).any() == 1 

True를 반환합니다.

지금 당신이 할 때 발생하는 볼 수 있습니다 -

data.xs(farts[1], level = 1).any(axis = 1) <= 0 

먼저 당신이 축을 변경, 지금 data.xs(farts[1], level = 1).any(axis = 1) 반환 단지 Trues 및 Falses 0과 거짓이 아닌 다른 값/1 진정한 값 (에 따라/0 인 값은 0). 이제 처음 두 값은 0/False이므로 이고 조건은 "< = 0"입니다. 결과는 사용자에게 표시됩니다. 시도해보십시오 -

data.xs(farts[1], level = 1).any(axis = 1) == 1 

그리고 반대 출력이 표시됩니다.

any()와 달리 all()은 다르게 작동합니다 ... 모두가 참이거나 모두 거짓이면 거짓을 반환하고 그렇지 않으면 거짓을 반환합니다.

그리고 방금 언급 -

anyor 또는 alland 당신이 생각하는 경우 동일하지 않습니다 .... 나하고하고 있습니다 비트 연산 그들이 short circuit evaluation에 따라 있지만 및 모든 기능은 모든 조건을 거칠 것입니다.

은 도움이 :)

+0

이것은 매우 도움이됩니다. 고맙습니다! 실제로 더 깊이 들어가서 다음을 시도했습니다 : mylist = [1,2,3,4,0, -1] print 'test 1 :', 모두 (mylist)> -1 print 'test 2 :', 모두 (i> -1 for mylist) Test 1이 True로 표시되고 Test 2가 False로 인쇄됩니다. 첫 번째 경우는 True (1)와 False (0) 두 가지 모두에 해당한다고 가정하고 생성자에서 평가할 때 다르게 동작합니다. –

+0

첫 번째 시도 인'all (mylist) '다시 조건은 없지만 목록에 0이 포함되어 있으므로 숫자가 0 인 False를 반환하므로 "> -1"로 테스트하면 True를 반환합니다. – hashcode55

+0

그리고 두 번째 테스트에서는 부울리스트를 테스트하고 있습니다! i> -1은 -1에 대해 False를 반환합니다. 그러면 False가되며,> = -1이면 true가됩니다! 당신이 염두에 두어야 할 기본 개념 ..... "iterable의 어떤 요소라도 참이면 true를 돌려 준다." - any 및 "iterable의 모든 요소가 참인 경우 true"를 반환합니다. - 모두 – hashcode55

3

이 간단한 시리즈를 고려 희망 :

import numpy as np 
np.random.seed(0) 
ser = pd.Series(np.random.randint(0, 3, 10)) 

ser 
Out[78]: 
0 0 
1 1 
2 0 
3 1 
4 1 
5 2 
6 0 
7 2 
8 0 
9 0 
dtype: int32 

의 당신이 비교 ser < 2, 그것은 부울 배열을 반환하고 싶어한다고 가정 해 봅시다 : 이제

ser < 2 
Out[79]: 
0  True 
1  True 
2  True 
3  True 
4  True 
5 False 
6  True 
7 False 
8  True 
9  True 
dtype: bool 

을 , 그 중 2 개가 2보다 작은 지 확인하려면이 어레이에서 any으로 전화해야합니다. ser < 2 배열의 값 중 적어도 하나가 True 경우

(ser < 2).any() 
Out[81]: True 

True를 리턴한다. .all()은 비슷하다

(ser < 2).all() 
Out[82]: False 

모든 그들에 해당하기 때문에, false를 반환합니다. 그것은 (ser < 3) 배열을 확인하고 해당 배열의 모든 요소가 True을하기 때문에

(ser < 3).all() 
Out[83]: True 

: 당신은 그것을 변경하는 경우.

이제 ser.any()을 해보자 :

ser.any() 
Out[84]: True 

을 여기 (0 True이면 1 등 True 인 경우 등) 원래 배열의 값 중 하나가 True 경우 당신은 확인된다. 이 배열의 값은 부울이 아닌 정수입니다. 0과 같지 않으면 True으로 평가됩니다. 따라서 배열에 적어도 하나의 0이 아니므로 True을 반환합니다.내가 ser.any() < 0을 선택하면

지금, 그것은 False를 반환합니다

ser.any() < 0 
Out[85]: False 

이 표현이 True < 0로 평가되기 때문에 : 0보다 작지 FalseTrue 때문이다

True < 0 
Out[86]: False 

무엇 유사한 일을하는 경우 :

data.xs(farts[1], level = 1).any() < 0 

먼저 해당 섹션에서 any()을 실행하고 그 섹션에 0이 아닌 요소가 있으므로 True을 반환합니다.

(data.xs(farts[1], level = 1) < 0).any() 

(data.xs(farts[1], level = 1) < 0) 부울 배열을 생성하고 그 배열의 요소 중 하나가 True 인 경우 .any()뿐만 아니라 True를 반환합니다 : 당신이 실제로 그들 중 하나가 0보다 작은 있는지 여부를 확인하려면, 당신은 입력해야 .

+0

응답 해 주셔서 감사합니다. 매우 도움이 :) –