[python] 데이터를 덮어 쓰지 않고 기존 Excel 파일에 쓰는 방법 (Pandas 사용)?

팬더를 사용하여 다음과 같은 방식으로 파일을 엑셀에 씁니다.

import pandas

writer = pandas.ExcelWriter('Masterfile.xlsx') 

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

Masterfile.xlsx는 이미 여러 개의 다른 탭으로 구성되어 있습니다. 그러나 아직 “Main”이 포함되어 있지 않습니다.

Pandas는 “메인”시트에 올바르게 씁니다. 불행히도 다른 모든 탭도 삭제합니다.



답변

Pandas 문서에 따르면 xlsx 파일에 openpyxl을 사용합니다. 의 코드를 훑어 보면 ExcelWriter다음과 같은 것이 잘 될 수 있다는 단서가 제공됩니다.

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl')
writer.book = book

## ExcelWriter for some reason uses writer.sheets to access the sheet.
## If you leave it empty it will not know that sheet Main is already there
## and will create a new sheet.

writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()


답변

다음은 도우미 기능입니다.

def append_df_to_excel(filename, df, sheet_name='Sheet1', startrow=None,
                       truncate_sheet=False,
                       **to_excel_kwargs):
    """
    Append a DataFrame [df] to existing Excel file [filename]
    into [sheet_name] Sheet.
    If [filename] doesn't exist, then this function will create it.

    Parameters:
      filename : File path or existing ExcelWriter
                 (Example: '/path/to/file.xlsx')
      df : dataframe to save to workbook
      sheet_name : Name of sheet which will contain DataFrame.
                   (default: 'Sheet1')
      startrow : upper left cell row to dump data frame.
                 Per default (startrow=None) calculate the last row
                 in the existing DF and write to the next row...
      truncate_sheet : truncate (remove and recreate) [sheet_name]
                       before writing DataFrame to Excel file
      to_excel_kwargs : arguments which will be passed to `DataFrame.to_excel()`
                        [can be dictionary]

    Returns: None
    """
    from openpyxl import load_workbook

    # ignore [engine] parameter if it was passed
    if 'engine' in to_excel_kwargs:
        to_excel_kwargs.pop('engine')

    writer = pd.ExcelWriter(filename, engine='openpyxl')

    # Python 2.x: define [FileNotFoundError] exception if it doesn't exist 
    try:
        FileNotFoundError
    except NameError:
        FileNotFoundError = IOError


    try:
        # try to open an existing workbook
        writer.book = load_workbook(filename)

        # get the last row in the existing Excel sheet
        # if it was not specified explicitly
        if startrow is None and sheet_name in writer.book.sheetnames:
            startrow = writer.book[sheet_name].max_row

        # truncate sheet
        if truncate_sheet and sheet_name in writer.book.sheetnames:
            # index of [sheet_name] sheet
            idx = writer.book.sheetnames.index(sheet_name)
            # remove [sheet_name]
            writer.book.remove(writer.book.worksheets[idx])
            # create an empty sheet [sheet_name] using old index
            writer.book.create_sheet(sheet_name, idx)

        # copy existing sheets
        writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
    except FileNotFoundError:
        # file does not exist yet, we will create it
        pass

    if startrow is None:
        startrow = 0

    # write out the new sheet
    df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)

    # save the workbook
    writer.save()

참고 : 팬더 <0.21.0에 대한 교체 sheet_name와 함께 sheetname!

사용 예 :

append_df_to_excel('d:/temp/test.xlsx', df)

append_df_to_excel('d:/temp/test.xlsx', df, header=None, index=False)

append_df_to_excel('d:/temp/test.xlsx', df, sheet_name='Sheet2', index=False)

append_df_to_excel('d:/temp/test.xlsx', df, sheet_name='Sheet2', index=False, startrow=25)


답변

openpyxlversion 2.4.0pandasversion을 사용하면 0.19.2@ski가 제안한 프로세스가 조금 더 간단 해집니다.

import pandas
from openpyxl import load_workbook

with pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') as writer:
    writer.book = load_workbook('Masterfile.xlsx')
    data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])
#That's it!


답변

pandas 0.24부터 다음과 같은 mode키워드 인수를 사용하여이를 단순화 할 수 있습니다 ExcelWriter.

import pandas as pd

with pd.ExcelWriter('the_file.xlsx', engine='openpyxl', mode='a') as writer:
     data_filtered.to_excel(writer) 


답변

오래된 질문이지만 일부 사람들은 여전히 ​​이것을 검색한다고 생각합니다.

모든 워크 시트가 sheetname = None 옵션으로 pandas가 만든 시트 이름 및 데이터 프레임 쌍의 사전에로드되기 때문에이 방법이 좋습니다. 스프레드 시트를 dict 형식으로 읽고 dict에서 다시 쓰는 사이에 워크 시트를 추가, 삭제 또는 수정하는 것은 간단합니다. 나를 위해 xlsxwriter는 속도와 형식 측면 에서이 특정 작업에 대해 openpyxl보다 더 잘 작동합니다.

참고 : 이후 버전의 Pandas (0.21.0+)는 “sheetname”매개 변수를 “sheet_name”으로 변경합니다.

# read a single or multi-sheet excel file
# (returns dict of sheetname(s), dataframe(s))
ws_dict = pd.read_excel(excel_file_path,
                        sheetname=None)

# all worksheets are accessible as dataframes.

# easy to change a worksheet as a dataframe:
mod_df = ws_dict['existing_worksheet']

# do work on mod_df...then reassign
ws_dict['existing_worksheet'] = mod_df

# add a dataframe to the workbook as a new worksheet with
# ws name, df as dict key, value:
ws_dict['new_worksheet'] = some_other_dataframe

# when done, write dictionary back to excel...
# xlsxwriter honors datetime and date formats
# (only included as example)...
with pd.ExcelWriter(excel_file_path,
                    engine='xlsxwriter',
                    datetime_format='yyyy-mm-dd',
                    date_format='yyyy-mm-dd') as writer:

    for ws_name, df_sheet in ws_dict.items():
        df_sheet.to_excel(writer, sheet_name=ws_name)

2013 년 질문의 예 :

ws_dict = pd.read_excel('Masterfile.xlsx',
                        sheetname=None)

ws_dict['Main'] = data_filtered[['Diff1', 'Diff2']]

with pd.ExcelWriter('Masterfile.xlsx',
                    engine='xlsxwriter') as writer:

    for ws_name, df_sheet in ws_dict.items():
        df_sheet.to_excel(writer, sheet_name=ws_name)


답변

이것이 오래된 스레드라는 것을 알고 있지만 이것은 검색 할 때 가장 먼저 찾은 항목이며 이미 만든 통합 문서에 차트를 유지해야하는 경우 위의 솔루션이 작동하지 않습니다. 이 경우 xlwings가 더 나은 옵션입니다. 엑셀 북에 쓸 수 있고 차트 / 차트 데이터를 유지할 수 있습니다.

간단한 예 :

import xlwings as xw
import pandas as pd

#create DF
months = ['2017-01','2017-02','2017-03','2017-04','2017-05','2017-06','2017-07','2017-08','2017-09','2017-10','2017-11','2017-12']
value1 = [x * 5+5 for x in range(len(months))]
df = pd.DataFrame(value1, index = months, columns = ['value1'])
df['value2'] = df['value1']+5
df['value3'] = df['value2']+5

#load workbook that has a chart in it
wb = xw.Book('C:\\data\\bookwithChart.xlsx')

ws = wb.sheets['chartData']

ws.range('A1').options(index=False).value = df

wb = xw.Book('C:\\data\\bookwithChart_updated.xlsx')

xw.apps[0].quit()


답변

pandas 0.24에는 더 나은 솔루션이 있습니다.

with pd.ExcelWriter(path, mode='a') as writer:
    s.to_excel(writer, sheet_name='another sheet', index=False)

전에:

여기에 이미지 설명 입력

후:

여기에 이미지 설명 입력

이제 판다를 업그레이드하십시오.

pip install --upgrade pandas