일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- c#
- Excel
- Tkinter
- Google Spreadsheet
- Mac
- PostgreSQL
- SQL
- django
- PySpark
- Kotlin
- 파이썬
- list
- GIT
- google apps script
- Python
- string
- PANDAS
- Apache
- Java
- gas
- array
- matplotlib
- math
- hive
- Redshift
- Google Excel
- numpy
- dataframe
- Github
- Today
- Total
달나라 노트
Python Pandas : DataFrame.to_excel & DataFrame.to_csv & pandas.ExcelWriter 본문
Python Pandas : DataFrame.to_excel & DataFrame.to_csv & pandas.ExcelWriter
CosmosProject 2020. 11. 9. 15:41
DataFrame.to_excel &emp; DataFrame.to_csv &emp; pandas.ExcelWriter
to_excel은 DataFrame 정보를 담아 xlsx 파일로 만들어주는 기능을 제공합니다.
to_csv는 DataFrame 정보를 담아 csv 파일로 만들어주는 기능을 제공합니다.
먼저 test용 DataFrame을 생성합니다.
import pandas as pd
dict_1 = {
'col1': [1, 1, 1, 2, 3, 3, 3, 3, 4, 4, 5],
'col2': [1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5],
'col3': [1, 2, 3, 2, 2, 3, 3, 3, 3, 4, 4]
}
df_1 = pd.DataFrame(dict_1)
print(df_1)
print(type(df_1))
- Output
col1 col2 col3
0 1 1 1
1 1 1 2
2 1 1 3
3 2 2 2
4 3 3 2
5 3 3 3
6 3 3 3
7 3 4 3
8 4 4 3
9 4 4 4
10 5 5 4
<class 'pandas.core.frame.DataFrame'>
read_excel의 경우 첫 번째 인자로 생성될 파일 이름을 포함한 경로를 명시해줍니다.
그리고 xlsx의 경우 한 파일에 시트(탭)가 여러 개일 수 있으므로 df_1의 데이터가 담길 xlsx의 시트이름을 지정해줍니다.
read_csv도 마찬가지로 생성될 파일 명과 경로를 입력해줍니다.
그리고 컬럼 구분자를 sep 옵션에 적어줍니다.
저는 콤마를 적어줬습니다.여기까지하고 보면 파일이 잘 생성된 것을 알 수 있습니다.
df_1.to_excel('~/Documents/test.xlsx', sheet_name='test')
df_1.to_csv('~/Documents/test.csv', sep=',')
위 예시에서 생성된 파일을 열어보면 내가 생성한 적이 없는 컬럼이 가장 왼쪽에 포함되어있음을 알 수 있습니다.
이것은 DataFrame의 row index정보입니다.
DataFrame의 index 정보까지 파일(.xlsx, .csv)에 포함되어 생성된 것입니다.
그러나 보통 엑셀을 다룰 때 index는 직접 명시해주지 않으므로 아래 예시처럼 index옵션을 False로 지정하여 row index가 표시되지 않게 해줍니다.
df_1.to_excel('~/Documents/test.xlsx', sheet_name='test', index=False)
df_1.to_csv('~/Documents/test.csv', sep=',', index=False)
df_1.to_csv('~/Documents/test.csv', sep=',', index=False, encoding='utf-8')
to_csv로 csv 파일을 생성하고 생성된 csv파일을 열어보면 정상적으로 데이터를 확인할 수 있습니다만,
만약 DataFrame에 한글이 포함되어있다면 간혹 csv파일을 열었을 때 한글이 깨져서 보이는 경우가 있습니다.
이것은 csv 파일의 encoding 때문인데, 이를 해결하려면 위에서처럼 to_csv에 encoding 옵션에 utf-8이라고 명시해주면 됩니다.
df_1.to_csv('~/Documents/test.csv', sep=',', index=False, encoding='utf-8-sig')
여기서 한 가지 더 팁이 있다면,
encoding을 utf-8로 설정해도 한글이 깨져보인다면 utf-9-sig로 encoding을 설정해줍시다.
그러면 한글이 깨지지 않고 잘 보일겁니다.
(그냥 처음부터 encoding을 utf-8-sig로 지정해주는것이 좋습니다.)
xlsx 파일은 한 파일에 여러 개의 시트(탭)를 가질 수 있다고 했습니다.
그럼 여러 개의 DataFrame을 하나의 파일 안에 다른 이름의 시트로 생성하고싶다면 어떻게 해야할까요?
그럴 땐 아래 예시처럼 ExcelWriter를 사용하면 됩니다.
import pandas as pd
dict_1 = {
'col1': [1, 1, 1, 2, 3, 3, 3, 3, 4, 4, 5],
'col2': [1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5],
'col3': [1, 2, 3, 2, 2, 3, 3, 3, 3, 4, 4]
}
dict_2 = {
'col1': [2, 3, 3, 4, 4, 5],
'col2': [2, 3, 3, 4, 4, 5],
'col3': [2, 2, 3, 3, 4, 4]
}
df_1 = pd.DataFrame(dict_1)
df_2 = pd.DataFrame(dict_2)
xl_writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df_1.to_excel(excel_writer=xl_writer, sheet_name='df_1_sheet', index=False)
df_2.to_excel(excel_writer=xl_writer, sheet_name='df_2_sheet', index=False)
xl_writer.close()
xl_writer라는 변수에 pd.ExcelWriter를 할당합니다.
이때 ExcelWriter의 첫 번쨰 인자로 생성될 파일명을 입력합니다.
이것의 뜻은 현재 위 코드가 적힌 python 파일이 있는 경로에 test.xlsx라는 파일을 만들겠다는 것입니다.
만약 더 하위경로에 저장하고싶으면 'output1/output2/test.xlsx' 이런식으로 현재 경로를 기준으로 더 하위 디렉토리를 명시해주면 됩니다.
두 번째 인자로 xlsx 파일을 생성할 것이기 때문에 engine옵션을 xlsxwriter로 적어줍니다.
그리고 df_1, df_2를 똑같이 to_excel옵션을 사용하여 xlsx파일로 만드는데
기존에는 to_excel의 첫 번째 인자로 생성될 파일의 경로와 이름을 적어줬었지만
이번에는 우리가 생성한 xl_writer를 넣어줍니다.
그 외 나머지는 동일합니다.
마지막으로 xl_writer를 close해줍니다.
여기까지 하면 현재 python 코드가 적힌 파일이 있는 디렉토리에 test.xlsx 파일이 생성된 것을 알 수 있으며,
df_1_sheet, df_2_sheet라는 이름의 2개의 시트가 각각의 DataFrame의 데이터를 담은채로 생성되었음을 볼 수 있습니다.
위 코드를 실행하면 xlsxwriter 모듈을 찾을 수 없다는 Error가 발생할 때가 있습니다.
이럴땐 아래 두 개의 명령어 중 하나를 이용하여 xlsxwriter 모듈을 설치해주면 위 예시가 정상적으로 실행될것입니다.
pip install xlsxwriter
sudo pip install xlsxwriter