안녕하세요~ 꽁냥이에요. 이번 포스팅에서는 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 파일을 열어보면 아래와 같이 (필터 박스에 가려져 있지만) 칼럼 폭이 칼럼 명에 맞게 조절되었고 첫 행 고정 그리고 필터 박스가 추가된 것을 알 수 있습니다.
꽁냥이는 첫 행 고정과 필터 박스를 자주 사용하는데 매번 옵션을 지정해줘야 하는 불편함을 없애보고자 이번 포스팅을 준비하게 되었습니다. 부디 이번 포스팅이 많은 분들께 도움이 되시길 바랍니다.
지금까지 꽁냥이 글 읽어주셔서 감사합니다.
'데이터 분석 > 데이터 전처리' 카테고리의 다른 글
[Pandas] Tip!! 원하는 데이터 구간 만들기 (feat. IntervalIndex.from_tuples) (0) | 2023.01.17 |
---|---|
[Pandas] 35. 데이터 구간 나누기 (feat. cut, qcut) (0) | 2023.01.17 |
[Pandas] 34. 데이터 재구조화(Reshape)하기 (feat. crosstab) (2) | 2022.11.21 |
[Pandas] 33. 데이터 재구조화(Reshape)하기 (feat. wide_to_long) (2) | 2022.11.21 |
[Pandas] 32. 데이터 재구조화(Reshape)하기 (feat. stack, unstack) (2) | 2022.11.19 |
댓글