파이썬 버전 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
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
|
|
|
|
|
'Python > Pandas' 카테고리의 다른 글
데이터셋활용 누락값 채우기, 데이터 조합-pandas(27) (0) | 2020.04.21 |
---|---|
불린리덕션(empty, any, all, bool)-pandas(26) (0) | 2020.04.19 |
객체간의 연산 add, sub, mul, div-pandas(24) (0) | 2020.04.05 |
랜덤 샘플의 추출 및 선택(sample)-pandas(23) (0) | 2019.11.09 |
중복데이터의 처리(duplicated, drop_duplicates)-pandas(22) (0) | 2019.11.06 |
댓글