데이터 분석 작업을 하다 보면 하나의 데이터프레임을 Excel 파일의 여러 시트에 나누어 저장해야 하는 경우가 자주 발생합니다. 예를 들어, 하나의 데이터프레임을 'first_sheet', 'second_sheet', 'third_sheet'라는 세 개의 시트로 내보낸다고 가정해 보겠습니다.
해결 방법
이 문제는 아래 단계를 따라 해결할 수 있습니다.
xlsxwriter 모듈 임포트: Excel 변환을 위해 xlsxwriter 모듈을 사용합니다. 설치되어 있지 않다면
pip install XlsxWriter명령으로 먼저 설치하세요.데이터프레임 정의: 내보낼 데이터프레임을 정의하고 df 변수에 할당합니다.
ExcelWriter 객체 생성: pd.ExcelWriter 함수에 생성할 Excel 파일 이름을 지정하고, engine 매개변수를 'xlsxwriter'로 설정합니다.
excel_writer = pd.ExcelWriter('pandas_df.xlsx', engine='xlsxwriter')
여러 시트로 내보내기: to_excel 메서드를 호출할 때 sheet_name 매개변수에 서로 다른 시트 이름을 지정하면, 하나의 파일 안에 여러 개의 시트로 데이터가 저장됩니다.
df.to_excel(excel_writer, sheet_name='first_sheet') df.to_excel(excel_writer, sheet_name='second_sheet') df.to_excel(excel_writer, sheet_name='third_sheet')
파일 저장: 마지막으로 save() 메서드를 호출하여 변경 사항을 파일에 저장합니다.
excel_writer.save()
전체 예제 코드
아래 코드를 통해 전체 과정을 더 쉽게 이해할 수 있습니다.
import pandas as pd
import xlsxwriter
df = pd.DataFrame({'Fruits': ["Apple","Orange","Mango","Kiwi"],
'City' : ["Shimla","Sydney","Lucknow","Wellington"]
})
print(df)
excel_writer = pd.ExcelWriter('pandas_df.xlsx', engine='xlsxwriter')
df.to_excel(excel_writer, sheet_name='first_sheet')
df.to_excel(excel_writer, sheet_name='second_sheet')
df.to_excel(excel_writer, sheet_name='third_sheet')
excel_writer.save()
실행 결과
위 코드를 실행하면 'pandas_df.xlsx'라는 이름의 Excel 파일이 생성되며, 파일 안에는 동일한 데이터가 담긴 세 개의 시트(first_sheet, second_sheet, third_sheet)가 포함됩니다.
참고: 최신 판다스 버전 사용 시 주의사항
pandas 1.5.0 이상 버전에서는 save() 메서드가 더 이상 사용되지 않으며(deprecated), 대신 close() 메서드나 with 문을 사용하는 것이 권장됩니다.
# 방법 1: close() 사용
excel_writer = pd.ExcelWriter('pandas_df.xlsx', engine='xlsxwriter')
df.to_excel(excel_writer, sheet_name='first_sheet')
df.to_excel(excel_writer, sheet_name='second_sheet')
df.to_excel(excel_writer, sheet_name='third_sheet')
excel_writer.close()
# 방법 2: with 문 사용 (자동으로 파일 저장 및 닫기)
with pd.ExcelWriter('pandas_df.xlsx', engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='first_sheet')
df.to_excel(writer, sheet_name='second_sheet')
df.to_excel(writer, sheet_name='third_sheet')