source

Panda를 사용하여 기존 엑셀 파일에 새 시트를 저장하는 방법은 무엇입니까?

lovecheck 2023. 7. 16. 13:40
반응형

Panda를 사용하여 기존 엑셀 파일에 새 시트를 저장하는 방법은 무엇입니까?

저는 excel 파일을 사용하여 파이썬으로 정교한 데이터를 저장하고 싶습니다.제 문제는 기존 엑셀 파일에 시트를 추가할 수 없다는 것입니다.이 문제를 해결하기 위해 사용할 샘플 코드를 제안합니다.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

이 코드는 두 개의 데이터 프레임을 각각 "x1"과 "x2"라는 두 개의 시트에 저장합니다.두 개의 새 데이터 프레임을 만들고 같은 코드를 사용하여 두 개의 새 시트('x3' 및 'x4')를 추가하려고 하면 원래 데이터가 손실됩니다.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

저는 'x1', 'x2', 'x3', 'x4' 4장의 엑셀 파일을 원합니다.저는 'xlsxwriter'가 유일한 '엔진'이 아니라 'openpyxl'이 있다는 것을 알고 있습니다.저는 또한 이미 이 문제에 대해 글을 쓴 다른 사람들이 있다는 것을 보았지만, 여전히 저는 그것을 어떻게 하는지 이해할 수 없습니다.

여기 이 링크에서 가져온 코드가 있습니다.

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

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

writer.save()

그들은 그것이 효과가 있다고 말하지만, 방법을 알아내기는 어렵습니다.저는 이런 맥락에서 "ws.title", "ws" 및 "dict"가 무엇인지 이해할 수 없습니다.

"x1"과 "x2"를 저장한 다음 파일을 닫고 다시 열고 "x3"과 "x4"를 추가하는 가장 좋은 방법은 무엇입니까?

감사해요.저는 완전한 사례가 동일한 문제를 가진 다른 사람들에게도 좋을 수 있다고 믿습니다.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.close()

여기서 엑셀 파일을 생성합니다. 제가 알기로는 "xslxwriter" 또는 "openpyxl" 엔진을 통해 생성되는지 여부는 그다지 중요하지 않습니다.

원본 데이터를 잃지 않고 쓰고 싶을 때

import pandas as pd
import numpy as np
from openpyxl import load_workbook

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

book = load_workbook(path)
writer = pd.ExcelWriter(path, engine = 'openpyxl')
writer.book = book

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.close()

이 코드가 작동합니다!

새 파일 생성용

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)
with pd.ExcelWriter('sample.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='x1')

할 때는 파에일추려면인사용다니합수를가하▁▁the다니▁for▁use사합용,▁app▁file▁to를 사용합니다.mode='a'pd.ExcelWriter.

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)
with pd.ExcelWriter('sample.xlsx', engine='openpyxl', mode='a') as writer:  
    df2.to_excel(writer, sheet_name='x2')

기본값은 입니다.mode ='w'설명서를 참조하십시오.

을 공한예서기파로중드입다니는하일에 .book 및 정및설writer.book be 될가가있는치있book에.줄을 서서.writer.sheets = dict((ws.title, ws) for ws in book.worksheets)워크북의 각 시트에 다음과 같이 액세스합니다.ws시트 제목은 다음과 같습니다.ws▁of▁diction▁a다니▁so▁are있의 사전을 만드는 것입니다.{sheet_titles: sheet}키, 값 쌍.그런 다음 이 사전은 작성자로 설정됩니다.시트. 기본적으로 이러한 단계는 기존 데이터를 로드하고 작성자에게 데이터를 입력하는 것입니다.

이미 파일을 가지고 있다고 가정해 보겠습니다.x1그리고.x2 에 예 코드를 사용하여 예 코드할 수 있습니다.x3그리고.x4.

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"
writer = pd.ExcelWriter(path, engine='openpyxl')
df3.to_excel(writer, 'x3', index=False)
df4.to_excel(writer, 'x4', index=False)
writer.save()

그것은 당신이 찾고 있는 것을 할 것입니다.

한 번에 여러 데이터를 기록하는 간단한 예입니다.또한 작성된 엑셀 파일(닫힌 엑셀 파일)의 시트에 데이터를 추가하고자 할 때도 마찬가지입니다.

엑셀에 처음 글을 쓸 때. ("df1"과 "df2"를 "1st_sheet"와 "2nd_sheet"에 적음)

import pandas as pd 
from openpyxl import load_workbook

df1 = pd.DataFrame([[1],[1]], columns=['a'])
df2 = pd.DataFrame([[2],[2]], columns=['b'])
df3 = pd.DataFrame([[3],[3]], columns=['c'])

excel_dir = "my/excel/dir"

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, '1st_sheet')   
    df2.to_excel(writer, '2nd_sheet')   
    writer.save()    

Excel을 닫은 후 동일한 Excel 파일에 데이터를 "추가"하고 다른 시트의 이름 "3rd_sheet"에 "df3"를 붙입니다.

book = load_workbook(excel_dir)
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer:
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)    

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet')  

    writer.save()     

excel 형식은 xls가 아니어야 하며 xlsxone을 사용할 수 있습니다.

Pandas DataFrame을 Excel에 저장할 때마다 다음 함수를 호출할 수 있습니다.

import os

def save_excel_sheet(df, filepath, sheetname, index=False):
    # Create file if it does not exist
    if not os.path.exists(filepath):
        df.to_excel(filepath, sheet_name=sheetname, index=index)

    # Otherwise, add a sheet. Overwrite if there exists one with the same name.
    else:
        with pd.ExcelWriter(filepath, engine='openpyxl', if_sheet_exists='replace', mode='a') as writer:
            df.to_excel(writer, sheet_name=sheetname, index=index)

이제 Pandas DataFrames를 지원하므로 openpyxl로 직접 작업하는 것을 강력히 추천합니다.

이를 통해 관련 Excel 및 Pandas 코드에 집중할 수 있습니다.

ExcelWriter를 사용하지 않고 openpyxl의 도구를 사용할 수 있습니다. 이렇게 하면 새 시트에 글꼴을 추가하는 것이 훨씬 쉬워집니다.openpyxl.styles

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

#Location of original excel sheet
fileLocation =r'C:\workspace\data.xlsx'

#Location of new file which can be the same as original file
writeLocation=r'C:\workspace\dataNew.xlsx'

data = {'Name':['Tom','Paul','Jeremy'],'Age':[32,43,34],'Salary':[20000,34000,32000]}

#The dataframe you want to add
df = pd.DataFrame(data)

#Load existing sheet as it is
book = load_workbook(fileLocation)
#create a new sheet
sheet = book.create_sheet("Sheet Name")

#Load dataframe into new sheet
for row in dataframe_to_rows(df, index=False, header=True):
    sheet.append(row)

#Save the modified excel at desired location    
book.save(writeLocation)

관심 있는 기존 시트(예: 'x1', 'x2')를 메모리에 읽고 새 시트를 추가하기 전에 다시 '쓰기'할 수 있습니다(파일의 시트와 메모리의 시트는 서로 다른 것이므로 읽지 않으면 손실됩니다).이 접근 방식은 'xlsxwriter'만 사용하고 openpyxl은 사용하지 않습니다.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

# begin <== read selected sheets and write them back
df1 = pd.read_excel(path, sheet_name='x1', index_col=0) # or sheet_name=0
df2 = pd.read_excel(path, sheet_name='x2', index_col=0) # or sheet_name=1
writer = pd.ExcelWriter(path, engine='xlsxwriter')
df1.to_excel(writer, sheet_name='x1')
df2.to_excel(writer, sheet_name='x2')
# end ==>

# now create more new sheets
x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name='x3')
df4.to_excel(writer, sheet_name='x4')
writer.save()
writer.close()

기존의 모든 시트를 보존하려면 위의 코드를 시작과 끝 사이에서 다음으로 바꿀 수 있습니다.

# read all existing sheets and write them back
writer = pd.ExcelWriter(path, engine='xlsxwriter')
xlsx = pd.ExcelFile(path)
for sheet in xlsx.sheet_names:
    df = xlsx.parse(sheet_name=sheet, index_col=0)
    df.to_excel(writer, sheet_name=sheet)

이에 대한 또 다른 간단한 방법은 다음과 같은 방법을 만드는 것입니다.

def _write_frame_to_new_sheet(path_to_file=None, sheet_name='sheet', data_frame=None):
    book = None
    try:
        book = load_workbook(path_to_file)
    except Exception:
        logging.debug('Creating new workbook at %s', path_to_file)
    with pd.ExcelWriter(path_to_file, engine='openpyxl') as writer:
        if book is not None:
            writer.book = book
        data_frame.to_excel(writer, sheet_name, index=False)

여기서는 워크북이 존재하는 경우 path_to_file에 워크북을 로드한 다음 data_framesheet_name이 있는 새 시트로 추가합니다.워크북이 존재하지 않으면 워크북이 만들어집니다.openpyxl이나 xlsxwriter 둘 다 append하지 않은 것 같습니다. 따라서 위의 @Stefano의 예와 같이 추가하려면 로드한 다음 다시 작성해야 합니다.

#This program is to read from excel workbook to fetch only the URL domain names and write to the existing excel workbook in a different sheet..
#Developer - Nilesh K
import pandas as pd
from openpyxl import load_workbook #for writting to the existing workbook

df = pd.read_excel("urlsearch_test.xlsx")

#You can use the below for the relative path.
# r"C:\Users\xyz\Desktop\Python\

l = [] #To make a list in for loop

#begin
#loop starts here for fetching http from a string and iterate thru the entire sheet. You can have your own logic here.
for index, row in df.iterrows():
    try: 
        str = (row['TEXT']) #string to read and iterate
        y = (index)
        str_pos = str.index('http') #fetched the index position for http
        str_pos1 = str.index('/', str.index('/')+2) #fetched the second 3rd position of / starting from http
        str_op = str[str_pos:str_pos1] #Substring the domain name
        l.append(str_op) #append the list with domain names

    #Error handling to skip the error rows and continue.
    except ValueError:
            print('Error!')
print(l)
l = list(dict.fromkeys(l)) #Keep distinct values, you can comment this line to get all the values
df1 = pd.DataFrame(l,columns=['URL']) #Create dataframe using the list
#end

#Write using openpyxl so it can be written to same workbook
book = load_workbook('urlsearch_test.xlsx')
writer = pd.ExcelWriter('urlsearch_test.xlsx',engine = 'openpyxl')
writer.book = book
df1.to_excel(writer,sheet_name = 'Sheet3')
writer.save()
writer.close()

#The below can be used to write to a different workbook without using openpyxl
#df1.to_excel(r"C:\Users\xyz\Desktop\Python\urlsearch1_test.xlsx",index='false',sheet_name='sheet1')

빈 시트를 추가하려면

xw = pd.ExcelWriter(file_path, engine='xlsxwriter')    
pd.DataFrame().to_excel(xw, 'sheet11')

빈 시트가 나오면,

sheet = xw.sheets['sheet11']

가장 쉬운 방법은 기능을 사용하는 것입니다.to_excel새로운 것을 지정하는 판다들의sheet_name다른 시트를 계속하는 기존 Excel 파일에 데이터를 저장할 위치입니다.

path = 'input/existing_file.xlsx'
df_new_data = pd.read_excel('input/new_data.xlsx')

df_new_data.to_excel(path, sheet_name='New Data', index=False)

업데이트: 이 작업을 수행하면 기존 Excel 파일을 다시 작성하여 다른 시트를 삭제하고 새 시트를 그대로 둡니다.그래서 불행하게도, 이것을 해결하는 유일한 방법은xlsxwriter다른 회답에서 제시한 바와 같이

import pandas as pd
import openpyxl

writer = pd.ExcelWriter('test.xlsx', engine='openpyxl')
data_df.to_excel(writer, 'sheet_name')
writer.save()
writer.close()

다음과 같은 솔루션이 저에게 효과가 있었습니다.

    # dataframe to save
    df = pd.DataFrame({"A":[1,2], "B":[3,4]})
    
    # path where you want to save
    path = "./..../..../.../test.xlsx"
    
    # if an excel sheet named `test` is already present append on sheet 2
    if os.path.isfile(path):  
      with pd.ExcelWriter(path, mode='a') as writer:
        df.to_excel(writer, sheet_name= "sheet_2")
    else:
    # if not present then write to a excel file on sheet 1
      with pd.ExcelWriter(path) as writer:
        df.to_excel(writer, sheet_name= "sheet_1")

이제 개의 을 서로 개 데 이 터 프 시 작 려 면 추 변 면 됩 하 니 경 다 속 계 고 하 가 루 를 프 하 성 에 트 다 레 른 서 을 임 로 ▁thesheet_name.

언급URL : https://stackoverflow.com/questions/42370977/how-to-save-a-new-sheet-in-an-existing-excel-file-using-pandas

반응형