본문 바로가기
Python/Pandas

객체간의 비교 연산(eq, ne, lt, gt, le, ge, equals)-pandas(25)

by 콩돌 2020. 4. 11.
반응형

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준


  객체간의 비교 연산


본 포스팅에서는 pandas 메서드를 사용하여 객체간의 비교 연산을 수행하는 것에 대해 다루도록 한다.



  객체간의 비교연산


Series와 DataFrame은 객체간 비교를 수행할 수 있도록 이항 비교 메서드(binary comparison method)들 가진다. 

  ○ eq, ne, lt, gt, le, ge

  ○ 이 메서드들은 Fortran유저들이라면 익숙하지 않을까 싶다.

  ○ 기호로도 사용이 가능하다.


각각의 연산 메서드들의 의미는 다음과 같다.

 비교연산 메서드

 기호(※)

 의미

 eq()

==

같다

 ne()

=!

다르다

 lt()

<

 작다

 gt()

>

크다

 le()

<

작거나 같다 

 ge()

 >=

크거나 같다 


※ 기호와 메서드의 차이?

  A.eq(B)와 A==B는 동일한 연산을 수행한다.

  다만, 차이점으로는 eq()와 같은 메서드를 사용할 경우 메서드에서 제공하는 옵션을 사용하여 좀 더 정교한 연산을 수행할 수 있다.

 

이 연산은 bool 타입을 가지는 pandas 객체를 생성한다. 

  ○ 즉, 불린배열을 생성한다.

이 boolean 객체들은 인덱싱을 사용할때 유용하다. 

  ○ 상세사항은 boolean 인덱싱에 대한 설명(링크)을 참고하자.



  메서드 사용 형식

비교 연산 메서드의 간단한 사용 형식은 다음과 같다.


연산 메서드 사용 형식)

result= object1.operation(object2, axis='columns')


여기서 operation은 연산 메서드를 입력받는다.

axis는 브로드캐스팅을 수행할 시 브로드캐스팅이 되는 방향을 입력받는다.


아래 예제는 단순한 메서드의 사용 예제를 보여준다.


비교연산 사용 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[4]: ex_df=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=['a','b','c'])

In[5]: ex_df

Out[5]: 

   a  b  c

0  1  2  3

1  4  5  6

2  7  8  9


# 메서드를 사용한 비교연산

In[6]: ex_df.eq(5)

Out[6]: 

       a      b      c

0  False  False  False

1  False   True  False

2  False  False  False


# 기호를 사용한 비교연산

In[7]: ex_df==5

Out[7]: 

       a      b      c

0  False  False  False

1  False   True  False

2  False  False  False


# 두 DataFrame의 객체간의 비교연산

In[8]: 2*ex_df == ex_df+ex_df

Out[8]: 

      a     b     c

0  True  True  True

1  True  True  True

2  True  True  True



  동등성을 평가하는 equals() 메서드

일반적으로 비교연산을 수행할 때 위의 메서드를 사용하는 것으로 해결이된다.

하지만 약간 완벽히 동등한지를 평가할 필요가 있을때에는 위에 소개된 ge()나 ==으로 비교하기에는 어려울 수 있다.

아래 예제를 통해 위의 내용을 설명해본다.

 

누락데이터(NaN) 비교 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[9]: ex_df=pd.DataFrame([[np.nan,2,3],[4,5,6],[np.nan,8,9]], columns=['a','b','c'])

In[10]: ex_df

Out[10]: 

     a  b  c

0  NaN  2  3

1  4.0  5  6

2  NaN  8  9


# NaN의 비교: 동일한 NaN임에도 불구하고 False이 출력됨

In[11]: 2*ex_df == ex_df+ex_df

Out[11]: 

       a     b     c

0  False  True  True

1   True  True  True

2  False  True  True


위의 예제에서 불린인덱스가 출력이 되는 한편, 동일하게 NaN 값을 가짐에도 False이 출력되는 것을 확인할 수 있다.

이것은 NaN 값은 동등하게 비교될 수 없기 때문에 위와 같은 상황이 벌어진다.


만약 사용자가 위와같은 상황에서 완벽히 동등성을 평가하고 싶다면, equals() 메서드를 사용하면 된다.

단, 이 메서드를 적용할 시에는 DataFrame 혹은 Series의 인덱스 순서가 같아야 True를 제대로 출력할 수 있음을 참고하자.

아래 예제는 equals() 메서드가 사용되는 것을 보여준다.


equals 메서드의 적용)

# equals 메서드의 적용

In[12]: (2*ex_df).equals(ex_df+ex_df)

Out[12]: True



  pandas 객체 외의 다른 객체와의 비교

사용자는 pandas 데이터 구조를 하나의 스칼라 값과 비교할 때 편리하게 요소확장 비교(브로드캐스팅)을 사용할 수 있다.

 

스칼라 데이터와의 비교 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[13]: ex_df=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=['a','b','c'])

In[14]: ex_df

Out[14]: 

   a  b  c

0  1  2  3

1  4  5  6

2  7  8  9


# 메서드 사용

In[15]: ex_df.ge(5)

Out[15]: 

       a      b      c

0  False  False  False

1  False   True   True

2   True   True   True


# 기호사용

In[16]: ex_df>=5

Out[16]: 

       a      b      c

0  False  False  False

1  False   True   True

2   True   True   True


pandas는 또한 요소확장 비교를 다른 배열 오브젝트에도 적용할 수 있다.


다른 오브젝트와의 비교 예제)

# 다른 객체와의 비교

In[17]: ex_df == [[1,4,7],[2,5,8],[3,6,9]]

Out[17]: 

      a     b     c

0  True  True  True

1  True  True  True

2  True  True  True


다른 길이의 Index 혹은 Series 객체를 비교할때면 ValueError가 발생한다.


다른 오브젝트와의 비교 예제)

# Serise와 Index객체 간의 비교

In[18]: pd.Series([1,2,3,4]) ==  pd.Index([2,3,4,5])

Out[18]: 

0    False

1    False

2    False

3    False

dtype: bool


# 길이가 다른 경우의 비교 결과

pd.Series([1,2,3,4]) ==  pd.Index([2,3,4])

ValueError: Lengths must match to compare


※ Numpy 비교연산과의 차이점

Numpy의 비교연산과 Pandas의 비교연산에는 차이를 보여준다.

  ○ 아래 예제와 pandas에서는 같이 만약에 단일형 자료형이 아니면 브로드캐스팅을 수행하지 않는 반면,

  ○ Numpy에서는 브로드캐스팅을 수행할 수 있으면 브로드캐스팅을 수행함을 알 수 있다.

  ○ 혹은 브로드캐스팅이 되지 않는 상황에서는 False를 반환한다.


Numpy와의 비교연산 차이 예제)

# pandas와 numpy의 객체간의 비교 및 브로드캐스팅

pd.Series([1,2,3,4]) == np.array([2])

ValueError: Lengths must match to compare


# numpy의 객체간의 비교 및 브로드캐스팅

np.array([1, 2, 3]) == np.array([2])

Out[27]: array([False,  True, False])


numpy의 객체간의 비교 및 브로드캐스팅 실패결과 출력

np.array([1, 2, 3]) == np.array([2,5])

Out[28]: False



  비교 메서드 세부사항


eq(), ne(), lt(), gt(), le(), ge()와 같은 메서드는 사실상 연산만 다르지 동일한 옵션을 가진다. 

  ○ eq() : 같다 (==)

  ○ ne() : 다르다 (=!)

  ○ lt() : 작다 (<)

  ○ gt() : 크다 (>)

  ○ le() : 작거나 같다 (<=)

  ○ ge() : 크거나 같다 (>=)


메서드에 대한 세부사항은 eq() 메서드를 예를들어 설명하도록 한다.


  DataFrame.eq(self, other, axis='columns', level=None)


other: scalar, sequence, Series, or DataFrame

연산을 수행할 데이터를 입력받는다.

하나의 단일값, Series, 시퀀스형 자료형, DataFrame 등을 입력받을 수 있다.


axis: {0 or ‘index’, 1 or ‘columns’}

브로드캐스팅을 수행할 시에 어느 쪽 방향으로 연산을 수행할지 결정한다.

  ○ 0 혹은 'index'를 입력받을 경우 동일 index를 가지는 값에 대해 브로드캐스팅을 수행하며,

  ○ 1 혹은 'columns'를 입력받을 경우는 동일 columns 주소를 가지는 값에 대해 브로드캐스팅을 수행한다. 

  ○ 기본값은 'columns'이다.


level: int or label

멀티인덱스에서 브로드캐스팅을 수행할 레벨을 선택한다.



  DataFrame.equals(self, other)

두 객체가 동일한 요소를 보유하고 있는지 테스트한다. 

위의 비교연산과는 다르게 NaN 데이터의 동일성도 테스트할 수 있다.

단, 두 객체의 데이터 뿐만이 아니라 데이터의 타입, 그리고 열이나 행의 인덱스 순서가 정확히 같아야 True를 출력한다.


other: Series, or DataFrame

비교할 데이터를 입력받는다.



 

 

 

 

 참고자료

  https://pandas.pydata.org/pandas-docs/stable/getting_started/basics.html

  

 

 

 

 



반응형

댓글