본문 바로가기
데이터 분석/데이터 전처리

[Pandas] Tip!! 데이터프레임(Data Frame)을 필터, 칼럼 폭 조정, 첫 행 고정 옵션을 적용하여 엑셀로 저장하기(feat. xlsxwriter)

by 부자 꽁냥이 2022. 12. 7.

안녕하세요~ 꽁냥이에요. 이번 포스팅에서는 Pandas 데이터프레임(Data Frame)을 엑셀 파일에 필터, 칼럼 폭 조정, 첫 행 고정 적용하는 방법을 소개합니다. 이러한 설정 옵션을 적용하면 엑셀 파일을 열고 분석할 때 편의성이 높아지지요.


   데이터프레임(Data Frame) 필터, 칼럼 폭 조정, 첫 행 고정 적용하기(feat.  xlsxwriter)

먼저 예제용 데이터를 만들고 바로 엑셀로 저장해보겠습니다.

 

import pandas as pd

## 예제 데이터
test_data = {
    '회계연도':[2002, 2003, 2004, 2005],
    '도미니카 공화국':[10, 20, 30, 40],
}
test_df = pd.DataFrame(test_data)

## 엑셀 저장
test_df.to_excel('just_test.xlsx', index=False)

 

그리고 엑셀 파일을 열어보면 아래와 같이 B 칼럼이 잘려 있네요.

 

 

이제 칼럼 폭을 조절하고 필터와 첫 행 고정 옵션을 설정해봅시다. 아래 apply_column_format 함수가 그 역할을 합니다. 해당 함수는 Pandas 데이터프레임과 엑셀 파일 저장 경로를 인자로 받습니다. 이때 get_width가 칼럼 폭을 계산해주는데 5~11줄을 보면 꽁냥이가 실험을 통해서 각 문자당 칼럼 폭을 계산해 놓았습니다(excel 2016 기준). 나머지 부분은 주석을 참고해주세요.

 

def apply_column_format(df, file_path):
    def get_width(test_str):
        import string
        import re
        letter_to_width = {
            'lower':0.95, ## 영어 소문자 하나당 칼럼 폭
            'upper':1.18, ## 영어 대문자 하나당 칼럼 폭
            'digit':1, ## 숫자 하나당 칼럼 폭
            'korea':1.85, ## 한국어 한 글자당 칼럼 폭
            'other':0.95, ## 나머지 한 문자당 칼럼 폭
        }
        width = 0
        for c in test_str:
            if c in string.ascii_lowercase:
                width += letter_to_width['lower']
            elif c in string.ascii_uppercase:
                width += letter_to_width['upper']
            elif c in string.digits:
                width += letter_to_width['digit']
            elif re.match(r'[ㄱ-힣]', c):
                width += letter_to_width['korea']
            else:
                width += letter_to_width['other']
                
        return width
                
    with pd.ExcelWriter(file_path, engine='xlsxwriter') as writer:
        df.to_excel(writer, index=False)
        ws = writer.sheets['Sheet1']
        
        ## 칼럼 폭 조절
        for i, col in enumerate(df.columns):
            width = get_width(col)
            ws.set_column(i, i, width+1) ## 여백을 위해 1 추가
            
        ws.autofilter(0, 0, df.shape[0] - 1, df.shape[1] - 1) ## 첫 행 필터 추가
        ws.freeze_panes(1, 0) ## 첫 행 고정

 

이제 해당 함수를 사용해봅시다.

 

apply_column_format(test_df, 'decorated_test.xlsx')

 

이제 decorated_test.xlsx 파일을 열어보면 아래와 같이 (필터 박스에 가려져 있지만) 칼럼 폭이 칼럼 명에 맞게 조절되었고 첫 행 고정 그리고 필터 박스가 추가된 것을 알 수 있습니다.

 


꽁냥이는 첫 행 고정과 필터 박스를 자주 사용하는데 매번 옵션을 지정해줘야 하는 불편함을 없애보고자 이번 포스팅을 준비하게 되었습니다. 부디 이번 포스팅이 많은 분들께 도움이 되시길 바랍니다.

 

지금까지 꽁냥이 글 읽어주셔서 감사합니다.


댓글


맨 위로