본문 바로가기
파이썬 (투자분석용)/Pandas 및 python 일반

[python] Pandas, 데이터프레임 비교하기(pandas.DataFrame.compare())

by amAToRoi 2022. 2. 10.
반응형

데이터프레임의 값을 비교하는 여러가지 방법이 있다.
언듯 생각나는 방법으로는...

  • values, iterrows() 또는 iteritems() method와 반복문을 혼합하여 for loop으로 검토하는 방법과
  • compare() method를 이용하는 방법이다.

프로그래밍에 익숙하며 사후 관리 영향도를 줄이려면 반복문을 활용하는 방법이 편리한 방법일 것이며, Pandas의 강력한 기능을 최대한 활용하고자 한다면 compare()를 사용하는 것도 좋은 방법이라 판단한다.

Pandas가 항상 그렇듯, 엄청나게 많은 기능을 제공하고 있음으로,
자기에게 적합한 기능을 찾고 그를 중심으로 사용하는 것이 정답에 가깝다.

 

1. compare 사용해보기

데이터 셋을 우선 준비해보자.
df는 기본 데이터셋이며, df2는 비교하기 위한 데이터셋이다. 컬럼 col1과 컬럼 col3에 약간의 차이를 두었다.

  • python 3.7.3
  • pandas 1.3.4
  • raspberry pi에서 테스트하였고, pandas doc 를 활용하였다.
import pandas as pd
import numpy as np
df = pd.DataFrame(
    {
        "col1": ["a", "a", "b", "b", "a"],
        "col2": [1.0, 2.0, 3.0, np.nan, 5.0],
        "col3": [1.0, 2.0, 3.0, 4.0, 5.0]
    },
    columns=["col1", "col2", "col3"],
)

''' 
결과물
>>> df
  col1  col2  col3
0    a   1.0   1.0
1    a   2.0   2.0
2    b   3.0   3.0
3    b   NaN   4.0
4    a   5.0   5.0
'''

# 비교 대상이 되는 DataFrame을 생성한다. df와 동일한 df2를 생성.
df2 = df.copy()

# 비교할 수 있도록 df2의 특정 값을 다른 값으로 변경한다.
df2.loc[0, 'col1'] = 'c'    # 원래는 'a'
df2.loc[2, 'col3'] = 4.0    # 원래는 3.0

'''
결과물
>>> df2
  col1  col2  col3
0    c   1.0   1.0
1    a   2.0   2.0
2    b   3.0   4.0
3    b   NaN   4.0
4    a   5.0   5.0
'''

 

101. 기본 사용법

df.compare(df2)

결과

>>> df.compare(df2)
  col1       col3
  self other self other
0    a     c  NaN   NaN
2  NaN   NaN  3.0   4.0

컬럼 col1col3 중 인덱스 02차이가 나는 값을 표시해 주고 있으며 차이가 나지 않는 경우에는 NaN으로 표시한다.

반환값은 DataFrame 으로 비교 후 차이가 있는 값을 self와 other로 표시하는 것을 기본으로 한다.
하위컬럼 self가 df 이며, other은 df2를 의미한다.

여기까지가 기본 사용방법이다. 나머지는 알아두면 좋을 사항들~

 

102. 주의사항

컬럼명, 인덱스명 및 크기는 모두 일치하여야 한다.
심지어 컬럼의 순서도 일치하여야 한다.

 

103. 표시방법 변경

align_axis로 self와 other를 세로로 (하위 인덱스로)표시

>>> df.compare(df2, align_axis=0)    # default 값은 1
        col1  col3
0 self     a   NaN
  other    c   NaN
2 self   NaN   3.0
  other  NaN   4.0

keep_shape로 DataFrame 형태를 유지

>>> df.compare(df2, keep_shape=True)    # default는 False
  col1       col2       col3
  self other self other self other
0    a     c  NaN   NaN  NaN   NaN
1  NaN   NaN  NaN   NaN  NaN   NaN
2  NaN   NaN  NaN   NaN  3.0   4.0
3  NaN   NaN  NaN   NaN  NaN   NaN
4  NaN   NaN  NaN   NaN  NaN   NaN

keep_equal로 일치하는 경우에도 Nan 대신, 값을 표시

>>> df.compare(df2, keep_shape=True, keep_equal=True)    # default는 False
  col1       col2       col3
  self other self other self other
0    a     c  1.0   1.0  1.0   1.0
1    a     a  2.0   2.0  2.0   2.0
2    b     b  3.0   3.0  3.0   4.0
3    b     b  NaN   NaN  4.0   4.0
4    a     a  5.0   5.0  5.0   5.0
반응형

댓글