달나라 노트

Python Pandas : DataFrame.to_excel & DataFrame.to_csv & pandas.ExcelWriter 본문

Python/Python Pandas

Python Pandas : DataFrame.to_excel & DataFrame.to_csv & pandas.ExcelWriter

CosmosProject 2020. 11. 9. 15:41
728x90
반응형

 

 

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



 

 

 

 

 

728x90
반응형
Comments