developer tip

Pandas : 데이터 프레임을 인덱싱하는 동안 여러 조건-예기치 않은 동작

optionbox 2020. 8. 30. 08:11
반응형

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

참고URL : https://stackoverflow.com/questions/22591174/pandas-multiple-conditions-while-indexing-data-frame-unexpected-behavior

반응형