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_frame을 sheet_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
'source' 카테고리의 다른 글
Git: 권한 거부(공개 키) 치명적 - 원격 리포지토리에서 읽을 수 없습니다.Git 저장소를 복제하는 동안 (0) | 2023.07.16 |
---|---|
Oracle 날짜가 주말인지 확인하시겠습니까? (0) | 2023.07.16 |
파이썬에서 파일의 MD5 체크섬을 어떻게 계산합니까? (0) | 2023.07.16 |
조건이 있는 Mongodb 집계 조회 (0) | 2023.07.16 |
Oracle에서 행을 열로 변환하는 방법 (0) | 2023.07.16 |