프로그래밍/Python

판다스 두 DataFrame 에서의 동일여부, 다른부분(차이점) 찾기

꿈꾸는 사람_Anthony 2021. 1. 25. 00:41
반응형

예제로 사용할 df(DataFrame) 정보

: 'location' column(열)의 1번항목이 다름('인천' / '강릉')

df1 = pd.DataFrame({
    'location': ['부산', '인천', '청주', '부산', '광주', '서울'],
    'fruits': ['apple', 'orange', 'banana', 'celery', 'apple', 'banana'],
    'price': [100, 100, 200, 300, 200, 200],
    'color': ['Red', 'Orange', 'Yellow', 'Green', 'Red', 'Yellow']
})

df2 = pd.DataFrame({
    'location': ['부산', '강릉', '청주', '부산', '광주', '서울'],
    'fruits': ['apple', 'orange', 'banana', 'celery', 'apple', 'banana'],
    'price': [100, 100, 200, 300, 200, 200],
    'color': ['Red', 'Orange', 'Yellow', 'Green', 'Red', 'Yellow']
})

https://blog.kakaocdn.net/dn/oRlGO/btqUhAmYRSV/1YVu4ASJbT4kYfVJBaRHGK/img.png

동일여부 판단 : df1.equals(df2) 사용

⇒ df.equals()함수의 반환값 : bool (True / False)

https://blog.kakaocdn.net/dn/elG4ev/btqUmIdtvlx/UvL6zAZGzPD5OKYU9t8T60/img.png

(이 equals함수는 series에도 적용가능하다

예시 :series1.equals(series2))

다른부분 찾기(두 df의 다른부분으로 이루어진 dataframe 반환)

def GetDifferences(df1, df2):
  df = pd.concat([df1, df2]).reset_index(drop=True)
  idx = [diff[0] for diff in df.groupby(list(df.columns)).groups.values() if len(diff) == 1]
  return df.reindex(idx)

https://blog.kakaocdn.net/dn/bgF4d2/btqUf1kL5Dq/NCkPl3RWIPl0BSEQdzBs61/img.png

코드 설명

  1. pd.concat( [df1, df2])

    : 두 dataframe 합치기

    결과

    https://blog.kakaocdn.net/dn/qfyqr/btqUmJ5bnPF/pH84xgOIqxwg3sb5LM9TGk/img.png
  2. df.reset_index(drop=True)

    drop=True : 기존 index 없애기

    : index 초기화(0~) / drop=True

    결과

    https://blog.kakaocdn.net/dn/cEYGsI/btqUnLv5VJh/GX2wy2sItewPAy93gD29k1/img.png

    drop=False
    결과

    https://blog.kakaocdn.net/dn/lmMZB/btqUuNsFkIa/Kh9wdgRxSDkLc5AJnRIsg0/img.png
  3. idx = [diff[0] for diff in df.groupby(list(df.columns)).groups.values() if len(diff) == 1]

    1. df.groupby( [column1, ...] ).gruop

      : list [] 안, 인자로 주어진 column들의 values들로 만들어질 수 있는 모든 경우를 구하고, 그 경우에 해당하는 row의 index를 dictionary 형태로 반환함

      결과

      https://blog.kakaocdn.net/dn/8NSql/btqUvCZb4sF/DOKypfxJL4WO3MKH2rkkOk/img.png
    2. idx = [diff[0] for diff in df.groupby(list(df.columns)).groups.values() if len(diff) == 1]
      : dictionary 의 value를 사용
      → value의 길이가 1, 즉 해당 data를 가지고 있는 row가 1개 밖에 없을 때,
      해당 row의 index를 반환

      결과

      https://blog.kakaocdn.net/dn/bJQDRM/btqUGS7tcky/3oKkff3BJ62g6KS3Tb6MdK/img.png
  4. df.reindex(idx)

    : df에서, index고 idx인 row를 추출함.

    (df.reindex()는 df에 직접 영향주지않고, 새로운 dataframe을 반환한다)

    결과

    https://blog.kakaocdn.net/dn/dQTiBf/btqUGT6ohpv/fxkUholbF6QKPWM8Mjdca1/img.png

참고 : https://stackoverflow.com/questions/20225110/comparing-two-dataframes-and-getting-the-differences

 

Comparing two dataframes and getting the differences

I have two dataframes. Examples: df1: Date Fruit Num Color 2013-11-24 Banana 22.1 Yellow 2013-11-24 Orange 8.6 Orange 2013-11-24 Apple 7.6 Green 2013-11-24 Celery 10.2 Green df2: Dat...

stackoverflow.com

 

반응형