Pandas 를 이용한 CSV 파일 비교

Pandas 를 이용한 CSV 파일 비교

Handling pandas in CSV files

해당 썸네일은 Wonkook Lee 님이 만드신 Thumbnail-Maker 를 이용하였습니다

오늘은 Naver boostcamp AI Tech 에서 주관한 마스크 이미지 분류 대회 진행 중 활용한 csv 비교 코드에 대해 기록하려 한다.

When do we need this?

우리 팀은 대회 중간쯤부터 1위를 기록하기 시작했다. 그때부터 제한된 제출기회로 인해 자신이 새로 학습시킨 모델이 기존 SoTA 모델보다 성능이 얼마나 향상됐는지를 가늠할 수 있는 수단이 필요했다.

Let’s Compare CSV

일단 비교할 CSV 를 살펴보자

                                            ImageID  ans
0      cbc5c6e168e63498590db46022617123f1fe1268.jpg   14
1      0e72482bf56b3581c081f7da2a6180b8792c7089.jpg    2
2      b549040c49190cedc41327748aeb197c1670f14d.jpg   14
3      4f9cb2a045c6d5b9e50ad3459ea7b791eb6e18bc.jpg   14
4      248428d9a4a5b6229a7081c32851b90cb8d38d0c.jpg   12
...                                             ...  ...
12595  d71d4570505d6af8f777690e63edfa8d85ea4476.jpg    2
12596  6cf1300e8e218716728d5820c0bab553306c2cfd.jpg    5
12597  8140edbba31c3a824e817e6d5fb95343199e2387.jpg    9
12598  030d439efe6fb5a7bafda45a393fc19f2bf57f54.jpg    1
12599  f1e0b9594ae9f72571f0a9dc67406ad41f2edab0.jpg    8

feature 로는 ImageIDans 가 있고 데이터의 개수는 총 12600개이다.

내가 원하는 작업은 sota.csv 파일과 model.csv(학습한 모델)ans 값을 비교해 다른 prediction 의 개수와 그 이미지를 보여주는 작업이다.

Code

df_sota = pd.read_csv("./sota.csv")
df_model = pd.read_csv("./model.csv")

SoTA 모델과 내가 학습시킨 모델을 read_csv 를 통해 각각 따로 읽어온다.

그 다음 각 ans 값들을 저장시킬 리스트를 만들어준다.

sota_ans = []
model_ans = []

for ans in df_sota["ans"]:
    sota_ans.append(ans)

for ans in df_model["ans"]:
    model_ans.append(ans)

이렇게 담아놓은 리스트들을 기반으로 다른 값들을 있는지 비교하고 새로운 데이터 프레임을 만들어보자

df_model['isSame'] = [sa == ma for sa, ma in zip(sota_ans, model_ans)]

df = df_model.set_index(df_model.isSame, drop=True)
            .drop(['isSame'], axis=1).drop(['ans'], axis=1)

df['sota_ans'] = sota_ans
df['model_ans'] = model_ans

코드 한줄 한줄 자세히 봐보자

df_model['isSame'] = [sa == ma for sa, ma in zip(sota_ans, model_ans)]은 python 의 list comprehension 을 이용하여 sota_ans 리스트와 model_ans 리스트 중 다른 값들만 뽑아낸다.

그렇게 새롭게 뽑아낸 리스트를 df_model 에 새로운 열인 isSame 을 만들어낸다.

df = df_model.set_index(df_model.isSame, drop=True)
            .drop(['isSame'], axis=1).drop(['ans'], axis=1)

은 우리가 만들어낸 isSame 열을 index 로 설정하고 기존에 있던 열을 drop=True 옵션을 통해 삭제한다. 그 다음 ans 열도 drop 시켜서 df 라는 새로운 데이터프레임을 새로 생성한다.

마지막에는 dfsota_ansmodel_ans 열을 추가해 따로 확인할 수 있게 한다. 만들어진 df 를 한번 봐보자

                                             ImageID  sota_ans  model_ans
isSame                                                                   
False   cbc5c6e168e63498590db46022617123f1fe1268.jpg        14         13
True    0e72482bf56b3581c081f7da2a6180b8792c7089.jpg         2          2
True    b549040c49190cedc41327748aeb197c1670f14d.jpg        14         14
False   4f9cb2a045c6d5b9e50ad3459ea7b791eb6e18bc.jpg        14         13
True    248428d9a4a5b6229a7081c32851b90cb8d38d0c.jpg        12         12
...                                              ...       ...        ...
True    d71d4570505d6af8f777690e63edfa8d85ea4476.jpg         2          2
True    6cf1300e8e218716728d5820c0bab553306c2cfd.jpg         5          5
True    8140edbba31c3a824e817e6d5fb95343199e2387.jpg         9          9

데이터프레임을 보면 우리가 원하지 않는 True 인 데이터들도 보이므로 False 인 데이터들만 뽑아오자.

df = df.loc[False].reset_index().drop(['isSame'], axis=1)

최종적으로 만들어진 df 는 아래와 같다

                                           ImageID  sota_ans  model_ans
0     cbc5c6e168e63498590db46022617123f1fe1268.jpg        14         13   
1     4f9cb2a045c6d5b9e50ad3459ea7b791eb6e18bc.jpg        14         13   
2     69ad31adcc3e6e8de7af886e970233fa61699045.jpg         4          5   
3     7665a0a126eec039d2c8baf9c6eedc004738c128.jpg         8          7   
4     91598d7dad0122459e004ecd8a4e745acbd63101.jpg         2          5   
...                                            ...       ...        ...   
1444  caed88568cf4380f515099757cba5693c83002e8.jpg        14         13   
1445  c86b0c90644d6471ffb6ae83a9fa83293c4820dc.jpg         4          3   
1446  f8783757207e48a90273fb479d3ea7c0890ebaf8.jpg        17         16   
1447  5f31f79e422ba9491f499b313b0b3fa33a4a9638.jpg         1          2   

지금까지 pandas 를 이용하여 csv 파일을 비교하는 법을 알아냈다. 다들 유용하게 읽었길 바란다.