다중 시트 Excel 스프레드 시트에 데이터 프레임 목록 저장


89

DataFrame 목록을 하나의 Excel 스프레드 시트로 내보내려면 어떻게해야합니까? 상태
문서 to_excel:

참고
기존 ExcelWriter 개체를 전달하면 시트가 기존 통합 문서에 추가됩니다. 하나의 통합 문서에 다른 DataFrame을 저장하는 데 사용할 수 있습니다.

writer = ExcelWriter('output.xlsx')
df1.to_excel(writer, 'sheet1')
df2.to_excel(writer, 'sheet2')
writer.save()

이에 따라 다음과 같이 DataFrame 목록을 하나의 스프레드 시트에 저장하는 함수를 작성할 수 있다고 생각했습니다.

from openpyxl.writer.excel import ExcelWriter
def save_xls(list_dfs, xls_path):
    writer = ExcelWriter(xls_path)
    for n, df in enumerate(list_dfs):
        df.to_excel(writer,'sheet%s' % n)
    writer.save()

그러나 (각각 to_excel개별적으로 저장할 수있는 두 개의 작은 DataFrame 목록이 있는 경우) 예외가 발생합니다 (Edit : traceback removed) .

AttributeError: 'str' object has no attribute 'worksheets'

아마도 내가 ExcelWriter제대로 전화를 걸지 않은 것 같습니다. 어떻게해야합니까?

답변:


135

pandas 자체 ExcelWriter클래스를 사용해야합니다 .

from pandas import ExcelWriter
# from pandas.io.parsers import ExcelWriter

그러면 save_xls함수가 예상대로 작동합니다.

def save_xls(list_dfs, xls_path):
    with ExcelWriter(xls_path) as writer:
        for n, df in enumerate(list_dfs):
            df.to_excel(writer,'sheet%s' % n)
        writer.save()

11
이 속도를 어떻게 찾습니까? 나는 어제 똑같은 일을 시도했고 2000 개의 열이있는 데이터 프레임을 .xlsx 파일에 쓰는 것이 솔리드 스테이트 드라이브가있는 괜찮은 워크 스테이션에서 100 행당 약 16 초가 걸리는 것을 발견했습니다. ipython에서 % prun을 사용한 빠른 프로파일 링은 이것이 XML 처리 때문임을 보여주었습니다. 결국 ExcelWriter 속도가 엄청나게 느리기 때문에 CSV를 통해 Excel로 데이터를 가져 왔습니다.
snth

6
2018 년에도 여전히 느립니다.
stmax

2
ExcelWriter컨텍스트 관리자로 사용할 수도 있습니다 . with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen

2
고마워 앤디. 'sheet%s' % n조금 설명해 주시겠습니까 ? 그것은 무엇을하고 어떻게 작동합니까?
Bowen Liu

2
@BowenLiu 시트의 이름을 sheet1, sheet2 등으로 지정하는 것입니다.
xiaomy

17

누군가가 데이터 프레임 사전으로이를 수행하는 방법에 대한 예제가 필요한 경우 :

from pandas import ExcelWriter

def save_xls(dict_df, path):
"""
Save a dictionary of dataframes to an excel file, with each dataframe as a seperate page
"""

    writer = ExcelWriter(path)
    for key in dict_df:
        dict_df[key].to_excel(writer, key)

    writer.save()

예: save_xls(dict_df = my_dict, path = '~/my_path.xls')


이것은 정말로 내 하루를 구했습니다. 그러나 그것이 효과가 있었지만 이해하지 못하는 것이 하나 있습니다. 부품 '%s' % key은 무엇을합니까? 설명해 주시겠습니까? 감사!
Bowen Liu

@BowenLiu는 사전 키 값을 가져 와서 엑셀 시트의 페이지 이름으로 사용합니다. '% s'는 "key"로 채워진 자리 표시 자입니다. 도움이되기를 바랍니다.
Jared Marks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.