Pandas : 데이터 프레임을 인덱싱하는 동안 여러 조건-예기치 않은 동작
두 열의 값으로 데이터 프레임의 행을 필터링하고 있습니다.
어떤 이유로 OR 연산자는 AND 연산자가 예상하는 것처럼 작동하며 그 반대의 경우도 마찬가지입니다.
내 테스트 코드 :
import pandas as pd
df = pd.DataFrame({'a': range(5), 'b': range(5) })
# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1
df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]
print pd.concat([df, df1, df2], axis=1,
keys = [ 'original df', 'using AND (&)', 'using OR (|)',])
그 결과 :
original df using AND (&) using OR (|)
a b a b a b
0 0 0 0 0 0 0
1 -1 -1 NaN NaN NaN NaN
2 2 2 2 2 2 2
3 -1 3 NaN NaN -1 3
4 4 -1 NaN NaN 4 -1
[5 rows x 6 columns]
보시다시피 AND
연산자는 적어도 하나의 값이 인 모든 행을 삭제합니다 -1
. 반면에 OR
연산자는 두 값을 모두 삭제하려면 두 값이 같아야 -1
합니다. 나는 정확히 반대 결과를 기대할 것입니다. 누구든지이 행동을 설명 할 수 있습니까?
pandas 0.13.1을 사용하고 있습니다.
보시다시피 AND 연산자는 하나 이상의 값이 -1 인 모든 행을 삭제합니다. 반면에 OR 연산자는 두 값을 모두 삭제하려면 -1과 같아야합니다.
맞습니다. 조건을 작성하는 것은 삭제하려는 항목이 아니라 유지 하려는 항목에 대한 것임을 기억하십시오 . 대상 df1
:
df1 = df[(df.a != -1) & (df.b != -1)]
" df.a
-1이 아니고 -1이 아닌 행을 유지하십시오"라는 말입니다 df.b
. 이는 최소한 하나의 값이 -1 인 모든 행을 삭제하는 것과 같습니다.
대상 df2
:
df2 = df[(df.a != -1) | (df.b != -1)]
당신은 "둘 중 하나의 행 계속 말을하는지 df.a
또는 df.b
하지를 -1"두 값은 -1 행을 삭제와 동일하다.
추신 : 연결 액세스는 df['a'][1] = -1
문제를 일으킬 수 있습니다. .loc
및 을 사용하는 습관을 갖는 것이 좋습니다 .iloc
.
query () 사용할 수 있습니다 .
df_filtered = df.query('a == 4 & b != 2')
여기에 약간의 수학적 논리 이론이 있습니다.
"NOT a AND NOT b" is the same as "NOT (a OR b)", so:
"a NOT -1 AND b NOT -1" is equivalent of "NOT (a is -1 OR b is -1)", which is opposite (Complement) of "(a is -1 OR b is -1)".
So if you want exact opposite result, df1 and df2 should be as below:
df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a == -1) | (df.b == -1)]
'developer tip' 카테고리의 다른 글
jQuery .hasClass () 대 .is () (0) | 2020.08.30 |
---|---|
Grunt 태스크에서 명령 실행 (0) | 2020.08.30 |
직접 Ctrl + Tab 순서를 사용하고 마지막 탭 이후에 새 탭을 만들도록 Sublime Text 2/3를 구성하는 방법은 무엇입니까? (0) | 2020.08.30 |
전쟁 파일을 만드는 방법 (0) | 2020.08.30 |
PHP의 URL에서 조각 (해시 '#'뒤의 값) 가져 오기 (0) | 2020.08.30 |