[Python pandas] DataFrame 을 Excel로 내보내기 (write DataFrame to Excel): pd.DataFrame.to_excel()
Python 분석과 프로그래밍/Python 데이터 전처리 2019. 8. 6. 23:42지난번 포스팅에서는 Python pandas의 pd.read_excel() 함수를 사용하여 외부의 Excel 파일을 읽어와서 pandas DataFrame으로 만드는 방법(https://rfriend.tistory.com/464)을 소개하였습니다.
이번 포스팅에서는 반대로 Python pandas의 to_excel() 메소드를 사용하여 pandas DataFrame을 Excel 파일에 내보내서 쓰는 방법을 소개하겠습니다.
(1) 하나의 DataFrame을 하나의 Excel Sheet에 쓰기
(2) 두 개 이상의 DataFrame을 여러개의 Excel Sheets에 나누어서 쓰기
(1) 하나의 DataFrame을 하나의 Excel Sheet에 쓰기 |
먼저 필요한 라이브러리를 불러오고 Excel 파일로 저장할 경로와 파일 이름을 설정하겠습니다.
In [1]: import numpy as np ...: import pandas as pd ...: import os In [2]: base_dir = "C:/Users/admin/Documents/data" ...: file_nm = "df.xlsx" ...: xlxs_dir = os.path.join(base_dir, file_nm) |
다음으로 예제로 사용할 DataFrame을 만들어보겠습니다.
In [3]: df = pd.DataFrame({'group': ['a', 'b', 'c', 'd', 'e'], ...: 'value_1': [10.056, 20.534, 30.90, 41.9423, 35.21], ...: 'value_2': [200, 500, 600, np.nan, 1200]}, ...: index = [1, 2, 3, 4, 5]) In [4]: df Out[4]: group value_1 value_2 1 a 10.0560 200.0 2 b 20.5340 500.0 3 c 30.9000 600.0 4 d 41.9423 NaN 5 e 35.2100 1200.0 |
이제 준비가 되었으니 'df'라는 이름의 DataFrame을 'df.xlxs' 라는 이름의 Excel 파일로 내보내기 (쓰기)를 to_excel() 메소드를 사용하여 해보겠습니다.
#-- write an object to an Excel sheet using pd.DataFrame.to_excel() df.to_excel(xlxs_dir, # directory and file name to write sheet_name = 'Sheet1', na_rep = 'NaN', float_format = "%.2f", header = True, #columns = ["group", "value_1", "value_2"], # if header is False index = True, index_label = "id", startrow = 1, startcol = 1, #engine = 'xlsxwriter', freeze_panes = (2, 0) ) |
위의 df.to_excel() 을 실행시켰더니 아래와 같이 'df.xlsx' 라는 이름의 Excel ('C:/Users/admin/Documents/data\\df.xlsx')에 'Sheet1' 의 sheet (sheet_name = 'Sheet1')에 df DataFrame이 잘 쓰여졌음을 확인할 수 있습니다.
'value_1' 칼럼은 부동소수형의 숫자가 들어있는데요, 자리수가 소수점 2자리 (float_format = "%.2f") 까지 반올림 되어서 보기에 좋게 제시가 되었습니다.
'value_2' 칼럼에 결측값이 포함되어 있는데요, 엑셀에는 'NaN'으로 표기(na_rep = 'NaN')가 되어있습니다.
열 이름은 DataFrame의 칼럼 이름(header = True)을 그대로 가져와서 사용하였으며, DataFrame의 index를 'id'라는 이름의 칼럼(index = True, index_label = "id")으로 내보냈습니다.
엑셀에 DataFrame을 쓸 때 처음 시작하는 행과 열의 위치를 2행, 2열로 지정(startrow = 1, startcol = 1)하였습니다.
그리고, 2행을 기준으로 틀 고정(freeze_panes = (2, 0))을 시켰습니다.
(2) 두 개 이상의 DataFrame을 여러개의 Excel Sheets에 나누어서 쓰기 |
예제로 사용할 두 개의 Python pandas DataFrame을 만들어보겠습니다.
In [8]: df_1 = df.copy() In [9]: df_2 = pd.DataFrame(np.arange(15).reshape(5, 3), ...: columns = ['col_1', 'col_2', 'col_3'], ...: index = [1, 2, 3, 4, 5]) In [10]: df_1 Out[10]: group value_1 value_2 1 a 10.0560 200.0 2 b 20.5340 500.0 3 c 30.9000 600.0 4 d 41.9423 NaN 5 e 35.2100 1200.0 In [11]: df_2 Out[11]: col_1 col_2 col_3 1 0 1 2 2 3 4 5 3 6 7 8 4 9 10 11 5 12 13 14 |
이제 'df_1'과 'df_2' 라는 이름의 2개의 DataFrame을 (1)번과 똑같은 경로의, 똑같은 파일 이름('C:/Users/admin/Documents/data\\df.xlsx') 으로 내보내서 써보겠습니다. 이렇게 동일한 파일 경로/이름을 사용하면 기존의 엑셀 파일을 덮어쓰기(overwirte) 해버리므로 기존 파일의 내용은 지워져버립니다 (주의 요망).
2개 이상의 DataFrame을 하나의 엑셀 파일에 여러개의 Sheets 로 나누어서 쓰려면 먼저 pd.ExcelWriter() 객체를 지정한 후에, sheet_name 을 나누어서 지정하여 써주어야 합니다.
# Write two DataFrames to Excel using to_excel(). Need to specify an ExcelWriter object first. with pd.ExcelWriter(xlxs_dir) as writer: df_1.to_excel(writer, sheet_name = 'DF_1') df_2.to_excel(writer, sheet_name = 'DF_2') |
'DF_1'과 'DF_2' 라는 이름의 Sheets 로 나누어서 2개의 DataFrame이 잘 쓰여졌음을 알 수 있습니다.
만약 같은 경로/이름의 Excel 파일이 열려있는 상태에서 df.to_excel() 을 실행하게 되면 "PermissionError: [Errno 13] Permission denied:" 에러가 발생합니다. 이때는 열려있는 Excel 파일을 닫고 df.to_excel() 을 다시 실행하던가 (덮어쓰기를 해도 괜찮다는 가정하에), 아니면 저장할 Excel 파일의 경로/이름을 바꾸어주기 바랍니다.
In [13]: with pd.ExcelWriter(xlxs_dir) as writer: ...: df_1.to_excel(writer, sheet_name = 'DF_1') ...: df_2.to_excel(writer, sheet_name = 'DF_2') ...: ...: Traceback (most recent call last): File "<ipython-input-13-9ba7e09cf9e3>", line 3, in <module> df_2.to_excel(writer, sheet_name = 'DF_2') File "C:\Users\admin\Anaconda3\lib\site-packages\pandas\io\excel.py", line 1191, in __exit__ self.close() File "C:\Users\admin\Anaconda3\lib\site-packages\pandas\io\excel.py", line 1195, in close return self.save() .... 중간 생략 .... File "C:\Users\admin\Anaconda3\lib\site-packages\xlsxwriter\workbook.py", line 611, in _store_workbook allowZip64=self.allow_zip64) File "C:\Users\admin\Anaconda3\lib\zipfile.py", line 1009, in __init__ self.fp = io.open(file, filemode) PermissionError: [Errno 13] Permission denied: 'C:/Users/admin/Documents/data\\df.xlsx' |
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)